JAVA数据库连接池总结

一、数据库连接池

数据库连接池的基本思想就是为数据库连接建立一个缓冲池,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完之后在放回去,节省连接建立、释放过程中的资源、时间消耗。
目前主流的数据库连接池有DBCP、C3P0、DRUID等几种。

1、DBCP

DBCP来自apache家族,是基于common-pool对象池机制的数据库连接池,目前有三个不同的版本支持不同的JDBC规范:
DBCP v1.3版本(JDBC3)
DBCP v1.4版本(JDBC4)
DBCP v2.X版本(JDBC4.1)

DBCP2 代表的也就是2.X版本,相比较于1.x版本,性能有了较大提升,支持JMX和一些新特性;DBCP2.X和DBCP1.x是不兼容的,包括具体配置上面的参数也有些不同;项目引用的类名称、maven仓库的位置坐标也不一样。

2、C3P0

C3P0 支持JDBC3规范和JDBC2的标准扩展; 在hibernate项目中使用的比较多;

3、DRUID

Druid 是阿里巴巴开源平台上一个数据库连接池实现,除了数据库连接池外,还提供了一系列内置的jdbc组件,可以监控DB连接池和sql执行情况。

二、主要区别

1、c3p0提供最大空闲时间,当连接超过最大空闲连接时间,当前连接就会被断掉。
2、DBCP提供最大连接数,当连接数超过最大连接数时候,所有连接都会被断开。
3、Druid结合了C3P0、DBCP的优点,同时针对不同的数据库,在实现上有针对性的优化。

三、使用建议

1、Druid除了连接池,监控功能也不错,便于优化,一般情况下推荐使用;
2、如果使用的是oracle数据库,不建议使用c3p0,因为c3p0不遵循LRU;

四、属性配置

spring中datasource的配置分别如下:

1、DBCP配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="XXX" value="XXX" />
    <!-- 连接初始值,连接池启动时创建的连接数量的初始值  默认值是0 -->  
    <property name="initialSize" value="3" />  
    <!-- 最小空闲值,当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请  默认值是0 -->  
    <property name="minIdle" value="3" /> 
    <!-- 最大空闲值,当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 ,0时无限制  默认值是8 --> 
    <property name="maxIdle" value="5" /> 
    <!-- 连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制   默认值是8 -->
    <property name="maxActive" value="15" /> 
    <!-- 等待超时以毫秒为单位,在抛出异常之前,池等待连接被回收的最长时间(当没有可用连接时)。设置为-1表示无限等待。  -->  
    <property name="maxWait" value="5000"/>  
    <!-- 设置自动回收超时连接 -->  
    <property name="removeAbandoned" value="true" />
    <!-- 自动回收超时时间(以秒数为单位) -->  
    <property name="removeAbandonedTimeout" value="200"/>
    <!-- 设置在自动回收超时连接的时候打印连接的超时错误  --> 
    <property name="logAbandoned" value="true"/>
</bean>

2、DBCP2配置

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="XXX" value="XXX" />
    <!-- 连接初始值,连接池启动时创建的连接数量的初始值  默认值是0 -->  
    <property name="initialSize" value="3" />  
    <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请  默认值是0 -->  
    <property name="minIdle" value="3" /> 
    <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 ,0时无限制  默认值是8 --> 
    <property name="maxIdle" value="5" /> 
    <!-- 连接池的最大值,同一时间可以从池分配的最多连接数量,0时无限制   默认值是8 -->
    <property name="maxTotal" value="15" /> 
</bean>

3、C3P0配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="XXX" value="XXX" />
    <!-- 连接池中保留的最小连接数,默认为:3 -->  
    <property name="minPoolSize" value="3" />  
    <!-- 连接池中保留的最大连接数。默认值: 15 -->  
    <property name="maxPoolSize" value="15" /> 
    <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3 -->  
    <property name="initialPoolSize" value="3" /> 
    <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
    <property name="maxIdleTime" value="60" />
    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    <property name="acquireIncrement" value="5" />
    <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
    <property name="idleConnectionTestPeriod" value="60" />
    <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
    <property name="acquireRetryAttempts" value="30" />
</bean>

4、DRUID配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="XXX" value="XXX" /> 
  <!-- 连接池初始化连接数,默认为:0 -->  
  <property name="initialSize" value="1" /> 
  <!-- 连接池最小连接数,默认为:无 --> 
  <property name="minIdle" value="1" /> 
  <!-- 连接池最大连接数,默认为:8--> 
  <property name="maxActive" value="10" />
  <!-- 获取连接等待超时的时间 --> 
  <property name="maxWait" value="10000" />
  <!-- 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  <!-- 一个连接在池中最小生存的时间,单位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <!-- 建议配置为true,不影响性能,并且保证安全性-->
  <property name="testWhileIdle" value="true" />
  <!-- 这里建议配置为TRUE,防止取到的连接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />
  <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />
  <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
  <property name="defaultAutoCommit" value="true" />
  <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
  <property name="validationQuery" value="select 1 " /> 
  <property name="filters" value="stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="xxxFilter" /> 
   </list> 
  </property> 
 </bean>

相关推荐