浅谈各种数据库连接池
1.各种数据库连接池
开源的免费连接池:
DBCP C3P0 Proxool Druid Jakarta DDConnectionBroker BoneCP
XAPool Primrose SmartPool MiniConnectionPoolManager
商业的中间件连接池:
weblogic的连接池 websphere的连接池
2. 常用的连接池比较:
DBCP可能是最常用的开源连接池,常用的原因
一是配置比较方便;
二是很多开源和tomcat的例子基本都是使用DBCP连接池。
该连接池的基本功能都有,比如配置最大和最小的连接数,连接等待时间等。
性能:在项目中测试,此连接池的持续运行的稳定性还是可以,但速度稍慢,
在高并发的压力下稳定性有所下降,不提供连接池监控。
C3P0也是常用的一款开源的连接池,在开发中用的也比较多,基本功能齐全。
性能:在项目中测试,发现此连接池的持续运行的稳定性相当不错,
在高并发的压力下稳定性也有一定的保证,不提供连接池监控
Proxool这个连接池可能较少有人使用,但其提供连接池监控也有一定的知名度,基本功能齐全。
性能:在项目中测试,此连接池的持续运行稳定性有一定的问题,但是因为他具备监控功能,
很多时候会用在开发测试的阶段,有助于确定是否有连接没有被关掉等来排除代码的一些性能问题。
上面的三种都是开源的连接池的比较,如果有机会使用商业的中间件连接池的话,开源的可以直接忽略掉,
因为花钱的东西和免费的东西完全不在一个量级。
简单的说下weblogic连接池,基本配置可以在网上查,这里说下weblogic连接池Test Reserved Connections
(对取得的连接进行测试)和Test Released Connections(对释放的连接进行测试)这两个选项,有时候在系统
压力大的时候会出现连接失效的异常,使用该连接池就会避免这个问题,因为Test Reserved Connections和
Test Released Connections在每次连接和释放的时候都会帮我们先测试,一旦检查 到连接是无效的他会废弃掉
还给数据库,只给你有效的。
性能:在具体项目应用中,此连接池的持续运行的稳定性强,在高并发的压力下性能也相当优秀,
在一些异常情况下连接池里的连接也能够及时释放。连接池监控一目了然,及时到位。
3.Druid数据库连接池
这里重点介绍下Druid连接池的配置和使用,Druid 是阿里的一款数据库连接池,据阿里介绍,Druid 是目前开源
中最好的连接池,在功能,性能,可扩展性方面远胜于其他的数据库连接池,并且Druid 已经部署了 超过7000个
阿里应用,经过了长时间生产环境大规模部署的严苛考验 ,这话有没有水分很难说,但确实有它的优点:
- druid 内置了一个功能强大的statfilter插件,能够详细统计sql的执行性能, 这可以帮助我们对线上访问数据库性能进行分析。
- 直接把数据库密码写在配置文件中是一个不好的行为,容易导致数据库安全问题,DruidDataSource支持PasswordCallBack可以解决这一问题。
- Druid提供了不同的LogFilter,可以根据情况选择。
- 如果对JDBC层有编程的需求,可以通过Druid提供的Filter机制,编写JDBC层的扩展插件。
下载 druid-0.2.20.jar http://download.csdn.net/detail/wind520/5670085
在web.xml中配置上下面这段,就可以实时查看连接池使用情况
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
datasource.xml中配置
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- initialSize默认0:初始化时建立物理连接的个数 -->
<property name="initialSize" value="${druid.initialSize}" />
<!-- maxActive默认8:最大连接池数量 -->
<property name="maxActive" value="${druid.maxActive}" />
<!-- minIdle默认8:最小连接池数量 -->
<property name="minIdle" value="${druid.minIdle}" />
<property name="maxWait" value="${druid.maxWait}" />
<property name="validationQuery" value="${validationQuery}" />
<property name="testOnBorrow" value="${druid.testOnBorrow}" />
<property name="testOnReturn" value="${druid.testOnReturn}" />
<property name="testWhileIdle" value="${druid.testWhileIdle}" />
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- minEvictableIdleTimeMillis:配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<!-- 当发生连接泄漏时,使用RemoveAbandanded相关配置,用来关闭长时间不使用的连接。 -->
<property name="removeAbandoned" value="${druid.removeAbandoned}" />
<!-- removeAbandonedTimeout:单位秒 -->
<property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="${druid.logAbandoned}" />
<property name="filters" value="${druid.filters}" />
</bean>