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>