首页 > 技术文章 > 浅谈各种数据库连接池

fyboke 2017-01-03 18:45 原文

 

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在每次连接和释放的时候都会帮我们先测试,一旦检查 到连接是无效的他会废弃掉

  还给数据库,只给你有效的。

   性能:在具体项目应用中,此连接池的持续运行的稳定性强,在高并发的压力下性能也相当优秀,

           在一些异常情况下连接池里的连接也能够及时释放。连接池监控一目了然,及时到位。

3Druid数据库连接池

   这里重点介绍下Druid连接池的配置和使用,Druid 是阿里的一款数据库连接池,据阿里介绍,Druid 是目前开源

   中最好的连接池,在功能,性能,可扩展性方面远胜于其他的数据库连接池,并且Druid 已经部署了 超过7000个

   阿里应用,经过了长时间生产环境大规模部署的严苛考验 ,这话有没有水分很难说,但确实有它的优点:

  1. druid 内置了一个功能强大的statfilter插件,能够详细统计sql的执行性能, 这可以帮助我们对线上访问数据库性能进行分析。
  2. 直接把数据库密码写在配置文件中是一个不好的行为,容易导致数据库安全问题,DruidDataSource支持PasswordCallBack可以解决这一问题。
  3. Druid提供了不同的LogFilter,可以根据情况选择。
  4. 如果对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>

推荐阅读