1 一个实际配置例子
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<database name="oracledb" default="true" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@172.16.1.1:1521/sms" username="" password="">
<param name="maxActive">20</param> <!--连接池在同一时间能够分配的最大活动连接的数量-->
<param name="maxIdle">20</param><!--连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放-->
<param name="minIdle">5</param> <!--连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接-->
<param name="maxWait">25000</param><!--当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常-->
<param name="testWhileIdle">true</param><!--指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除-->
<param name="testOnBorrow">true</param><!--指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.注意: 设置为true后如果要生
效,validationQuery参数必须设置为非空字符串-->
<param name="testOnReturn">false</param><!--指明是否在归还到池中前进行检验-->
<param name="validationQuery">select sysdate from dual</param><!--SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前-->
<param name="validationQueryTimeout">1</param>
<param name="timeBetweenEvictionRunsMillis">30000</param><!--在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程-->
<param name="numTestsPerEvictionRun">20</param><!--在每次空闲连接回收器线程(如果有)运行时检查的连接数量-->
<param name="minEvictableIdleTimeMillis">1800000</param><!--连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,
单位毫秒, 注:如果有防火墙连接session超时设置,要考虑当防火墙session结束时被kill,会导致DB数据连接不会被清连接池清除的情况发生,应设置此项空闲回收时间<防火墙session空闲超时。-->
<param name="removeAbandoned">true</param><!--标记是否删除泄露的连接,如果他们超过了
removeAbandonedTimout的限制.如果设置为true, 连接被认为是被泄露并且可以被删除-->
<param name="removeAbandonedTimeout">24</param><!--泄露的连接可以被删除的超时值, 单位秒-->
</database>
</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” />