1 一个实际配置例子
<?xml version="1.0" encoding="UTF-8" ?>
<config></config>
2. 使用注意点
1) 如果maxIdle 设置太低,在高负载系统中,连接的打开时间比关闭的时间快,会引起
连接池中的idle的个数上升超过maxIdle,造成频繁的销毁和创建,类似于jvm参数中的Xmx设置。
2) minIdle,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗
资源的,但是不能太大,因为在机器很空闲的时候,也会创建低于minIdle个数的连接,类似于jvm参数中的Xms设置。 3) PreparedStatements会在数据库中保持打开的游标,这样会造成一个连接超出数据库
游标限制, 特别是当maxOpenPreparedStatements 被设置成 default (unlimited),并且应用在一个连接上创建了大量不同PreparedStatements时,为了避免这个问题, maxOpenPreparedStatements 应该设置为一个小于数据库在一个连接上允许打开最大游标数。 4) poolPreparedStatements,经过测试,开启后的性能没有关闭的好,或者相差不大,没
有本质的提高。
5) 对性能影响比较大的两个参数:
testOnBorrow:这个默认的之是true,对性能影响很大,因为每次从池中借出对象时进行一次验证,系统开销很大,实际测试中发现,性能差距有7-10倍的样子。
maxIdle:如果这个参数的值比maxActive低,在高负载的情况下就会产生很多time_waited线
程。根据我们的测试结果,这个值最好和maxActive相同或者是设成-1。这样才能在高并发下,应用到数据库的连接也是稳定的使用固有的connection。否则dbcp会频繁创建新的连接,丢弃老的连接。而创建连接这个操作,比验证还要昂贵。
由于将maxIdle设置了一个比较高的值,应用就会在系统高峰时期创建的连接就会维持在那里。在空闲的时候这些连接就显得有些浪费。很多的时候数据库机器可能会支持多个应用,或者一个集群可能会有很多台应用机器。为了能这些空闲连接能够回收,就必须设置着一个配置项。这个值和minEvictableIdleTimeMillis以及numTestsPerEvictionRun会影响evictor thread的行为。默认timeBetweenEvictionRunsMillis的值是-1,就是不会运行。但是如果它设了一个不为-1的值,那么minEvictableIdleTimeMillis就不能设置的太短,默认的30分钟是个不错的选择。
3 配置样例
<bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy- method=“close”>
<property name=“driverClassName” value=“${db_driverClassName}” /> <property name=“url” value=“${db_rul}” />
<property name=“username” value=”${db_user}” /> <property name=“password” value=”${db_passwd}” />
<property name=“maxActive” value=”${db_maxActive }” /> <property name=“initialSize” value=”${db_initialSize}” /> <property name=“maxWait” value=”${db_maxWait}” /> <property name=“maxIdle” value=”${db_maxIdle }” /> <property name=“minIdle” value=”${db_minIdle}” />
<property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="testOnBorrow" value="false" /> <property name="testWhileIdle" value="true" />
<property name="validationQuery" value="select 1 from dual" /> <property name=“removeAbandoned” value=”true” />
<property name=“removeAbandonedTimeout” value=”180” />
<bean id=“dataSource” class=“org.apache.commons.dbcp.BasicDataSource” destroy
-
method=“close”>
<property name=“driverClassName” value=“
${db_driverClassName}
”
/>
<property name=“url” value=“
${db_rul}
” />
<property name=“username”
valu
e=”${db_user}” /
>
<property name=“password”
value
=”${db_passwd}” /
>
<property name=“maxActive”
value=”${db_
maxActive
}” />
<property name=“initialSize”
value=”${db_initialSize}” />
<property name=“maxWait”
value=”${db_maxWait}” />
<property name=“maxIdle”
value=”${db_maxIdle }” />
<property name=“minIdle”
value=”${db_minIdle}” />
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="testOnBorrow" value="false" />
<property name="testWhileIdle" value="true" />
<property name="validationQuery" value="select 1 from dual" />
<property name=“removeAbandoned”
value=”true” />
<property name=“removeAbandonedTimeout”
value=”180” />