一、数据库连接池
数据库连接池的基本思想就是为数据库连接建立一个缓冲池,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完之后在放回去,节省连接建立、释放过程中的资源、时间消耗。
目前主流的数据库连接池有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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。