Java数据库连接池了解与选择

1.百科理解

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

也就是相当于线程池一样创建好,避免用的时候再去创建数据库链接对象;

2.Java处理机制

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

3.常见连接池介绍

C3P0

是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。

BoneCP

是一个开源的快速的 JDBC 连接池。BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是 BoneCP 优秀的原因,BoneCP 到底有什么突出的地方呢,请看看性能测试报告。(主页:http://jolbox.com/)

DBCP 

(Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本对应 JDK 1.6 和 JDBC 4。因此在选择版本的时候要看看你用的是什么 JDK 版本了,功能上倒是没有什么区别。(主页:http://commons.apache.org/dbcp/)

Proxool

是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

Druid 连接池简介

Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

Druid是一个JDBC组件,它包括三个部分:

基于Filter-Chain模式的插件体系。DruidDataSource 高效可管理的数据库连接池。

SQLParser Druid的功能

1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 
3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 
4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 
5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

使用原因

原先项目使用的是C3P0连接池,在项目发布使用一段时间后发现c3p0 连接池访问数据库的时候创建连接会在oralce的lisenter.log 日志文件记录。  经过一段时间观察发现oralce每6秒会在lisenter.log日志记录一次,我们设置的最小连接是20,所以oracle每次会在日志记录20条。随着时间越长日志文件越来越大,当日志文件达到4个G的时候会导致oracle死掉。 经过不断调整参数配置还是无法得到解决方案,最后选择使用阿里Druid连接池试试,Druid默认最小连接2个,配置好后发布观察日志发现只在创建的时候在日志里面记录了2条记录。没有像C3P0那样每6秒记录一次导致日志文件越来越大。 

Druid使用

1. Druid.jar包 druid-1.1.4.jar

2.Druid连接池配置

Java数据库连接池了解与选择

 

 最小连接数 ,默认为2个。

数据源监控配置,web.xml

 1 <filter>
 2         <filter-name>DruidWebStatFilter</filter-name>
 3         <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
 4         <init-param>
 5             <param-name>exclusions</param-name>
 6             <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
 7         </init-param>
 8     </filter>
 9     <filter-mapping>
10         <filter-name>DruidWebStatFilter</filter-name>
11         <url-pattern>/*</url-pattern>
12     </filter-mapping>
13     
14     <servlet>
15         <servlet-name>DruidStatView</servlet-name>
16         <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
17     </servlet>
18     <servlet-mapping>
19         <servlet-name>DruidStatView</servlet-name>
20         <url-pattern>/druid/*</url-pattern>
21     </servlet-mapping>

4.商业中间件连接池

1 weblogic的连接池

weblogic 8 是一个让人使用起来很轻松方便的应用服务器软件,但是到了9简直就是折磨,不知道是bea是怎么想的,oracle收购了bea以后出了10,比9强不少,但是最喜欢的还是8。。。 题外话不说了,就以8.1版本介绍一下他的数据库连接池(其实10的配置也差不多) 首先是连接池的基本设置,这个不讲了,网上有很多教程。然后进入Data Sources菜单配置数据源里边的JNDI Name,要和之前在应用配置中的一致:jdbc/myapp。 然后是连接池一些具体项目的配置,包括设置最小(Initial Capacity),最大( Maximum Capacity)连接,以及 每次连接增加时需要一次性增加多少连接(Capacity Increment)。Allow Shrinking(是否把不用的连接退还数据库以保持最小连接数--这个就可以参见之前的连接池阐述的例子进行理解了)。 另外还有几个有意思的选项Test Reserved Connections:对取得的连接进行测试,Test Released Connections:对释放的连接进行测试。有人会问了,这个有什么用啊? 不知道大家在项目中有没有遇到java报连接失效的异常,反正我碰到过,只有在系统压力大的时候才出现。而有了这个选项就不用担心这个问题了--因为连接池已经帮你测试了,一旦检查到连接是无效的他会废弃掉还给数据库,只给你有效的。不过这个连接失效的异常其实多半是应用的不严谨造成的,我们更因该关心应代码的问题--但起码weblogic想到帮你弥补一下,是不是很贴心:) 另外一个重要功能当然是连接池监控:monitor选项卡里可以看到使用情况,有人又要问了,没有什么指标啊,别忘了custom view这个功能链接哦:) 有以下指标:当前连接数、曾经达到的峰值、可以使用的连接数、等待的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的 使用评价:在具体项目应用中,此连接池的持续运行的稳定性很强,在大并发量的压力下性能也相当优秀,另外在一些异常情况下连接池里的连接也能够及时释放。           连接池监控一目了然,及时到位。

2 websphere的连接池

功能强大,使用复杂:进入控制台使用“JDBC提供程序”功能菜单进行连接池的基本配置,一路下来,不同的数据库配置方式不尽相同,最奇怪的是还要单独手工加上user和password参数,如果没有 资料指导的话还真是摸不着头脑。这些基本设置还是网上找吧很多的。连接池设置完还需要设置数据源,jndi名字一样与之前的对应:jdbc/myapp 高级设置包括初始化连接数,最大连接,连接有效性检查,不使用超时。。其实这些都和weblogic中的连接池配置大致一样。 连接池监控:使用运行监控菜单,里边会有一个监控项目选择,选jdbc监控即可,可恶的是一开始弹出什么服务器操作系统需要安装什么图形化控件,选择是那么就得去找到控件在操作系统(linux)下安装,然后很多的依赖组件都没有。。。搞了半天才发现选择否,监控数据以及图形一样能出来嘛,真是要怒了。 虽然经过一番波折但是监控的内容还是很强大的,就连接池来说一样包括当前连接数、曾经达到的峰值、可以使用的连接数、从数据库打开的连接数、曾经关闭的连接数。。。其中前3项是我最关注的,比较奇怪的现象是应用刚启动的时候已开启的连接数量竟然没有达到初始定义的连接数量,不清楚websphere是怎么个计算机制。 另外在压力大的时候可使用的连接数会是负数,当时很奇怪,想想也了然了,那个负数肯定是排队等待的数量了 使用评价:在具体项目应用中,此连接池的持续运行的稳定性相当强,在大并发量的压力下性能也足够优秀,另外在一些异常情况下连接池里的连接能够及时释放,连接池监控配置有些复杂,但是配置好后各项指标一目了然并且有图形显示 

Java数据库连接池了解与选择

上一篇:MongoDB 的高级查询


下一篇:MySQL LOCK--按照非聚集索引更新时如何加锁