您的位置:首页 > 其它

DBCP连接池配置参数说明

2016-11-07 10:56 513 查看
转载url:http://blog.csdn.net/fairyhawk/article/details/7565391

说明:不是jdbc连接。

逻辑理解url:http://www.cnblogs.com/gogly/archive/2012/11/05/2755838.html

基本参数:

username:用户名

password:密码

url:连接url

driverClassName:驱动名

maxActive:最大并发连接数

maxIdle:最大空闲数

minIdle:最小空闲数(理论上无效)

initialSize:初始化连接数

maxWait:建立连接过程最大的等待时间,超时报错

优化参数:

1,泄露连接:<brremoveAbandoned:移除泄露的链接

removeAbandonedTimeout:泄露连接的定义时间(要超过最大事务的处理时间)

logAbandoned:移除泄露连接发生是是否记录日志

泄露连接的定义如下(连接使用完后没有归还连接池):

连接池包含一些诊断操作。jdbc-pool和Common DBCP都能够检测和减轻没有返回连接池中的连接。这里演示是被称为抛出内存泄露的连接。

[html] view
plain copy

Connection con = dataSource.getConnection();  

Statement st = con.createStatement();  

st.executeUpdate("insert into id(value) values (1'); //SQLException here  

con.close(); 

2,连接有效性验证

testOnBorrow:调用前测试(正式系统影响性能)

testOnReturn:调用后测试(正式系统影响性能)

testWhileIdle:空闲时测试

minEvictableIdleTimeMillis:连接在池中空闲超过n毫秒被认定为是空闲连接,可能被回收线程回收

timeBetweenEvictionRunsMillis:回收线程扫描频率。该参数设置后,初次创建数据池时,会根据池中每个连接都进行一个有效连接的测试,即执行特定sql。执行完毕后,等待minEvictableIdleTimeMillis时长,再执行特定sql。

numTestsPerEvictionRun:回收线程扫描数量。
例1:如果当前数据池有2个有效连接,此参数设定为10,则timeBetweenEvictionRunsMillis 时间执行一次特定sql,执行的sql数量为2;

例2:如果当前数据池有2个有效连接,此参数设定为1,则timeBetweenEvictionRunsMillis 时间执行一次特定sql,执行的sql数量为1;

执行的sql为固定的:

2016-12-05T11:46:39.044701Z   136 Query/* mysql-connector-java-5.1.22 ( Revision: ${bzr.revision-id} ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout'
OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name
= 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name
= 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'

validationQuery=select 1;:验证查询语句

validationQueryTimeout:验证查询语句超时时间

高级参数(一般不涉及,未完待续):

defaultAutoCommit:是否默认提交

defaultReadOnly:是否默认只读模式

defaultTransactionIsolation:默认事务级别

defaultCatalog:

initConnectionSqls:初始化连接sql

accessToUnderlyingConnectionAllowed

poolPreparedStatements

maxOpenPreparedStatements

connectionProperties

配置样例:

<bean id="dataSource"  

          class="org.apache.commons.dbcp.BasicDataSource"  

          destroy-method="close">  

        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  

        <property name="url" value="jdbc:mysql://192.168.0.109:3306/test?useUnicode=true&characterEncoding=UTF-8"/>  

        <property name="username" value="root"/>  

        <property name="password" value="root"/>  

        <!--maxActive: 最大连接数量-->    

        <property name="maxActive" value="150"/>  

        <!--minIdle: 最小空闲连接-->    

        <property name="minIdle" value="5"/>  

        <!--maxIdle: 最大空闲连接-->    

        <property name="maxIdle" value="20"/>  

        <!--initialSize: 初始化连接-->    

        <property name="initialSize" value="30"/>  

        <!-- 连接被泄露时是否打印:与removeAbandoned,removeAbandonedTimeout一起设置-->  

        <property name="logAbandoned" value="true"/>  

        <!--removeAbandoned: 是否自动回收超时连接-->    

        <property name="removeAbandoned"  value="true"/>  

        <!--removeAbandonedTimeout: 当一个连接活动的时间超过多久被认定为是泄露的或不正常的-->    

        <property name="removeAbandonedTimeout" value="10"/>  

        <!--maxWait: 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。->  

        <property name="maxWait" value="1000"/>  

        <!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->  

        <property name="timeBetweenEvictionRunsMillis" value="10000"/>  

        <!--  在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->  

        <property name="numTestsPerEvictionRun" value="10"/>  

        <!-- 1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程-->  

        <property name="minEvictableIdleTimeMillis" value="10000"/>  

    <property name="validationQuery" value="SELECT NOW() FROM DUAL"/>  

    </bean>  

验证逻辑:

对应的配置文件:
<property name="initialSize" value="5" />

        <property name="maxActive" value="50" />

        <property name="minIdle" value="2" />

        <property name="maxIdle" value="20" />
<property name="timeBetweenEvictionRunsMillis" value="10000"/>  

        <!--  在每次空闲连接回收器线程(如果有)运行时检查的连接数量 ,-->  

        <property name="numTestsPerEvictionRun" value="1"/>  

        <!-- 1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程-->  

        <property name="minEvictableIdleTimeMillis" value="1000000"/>  

1,启动后,先执行特定的校验语句。执行次数为initialSize数量(每个连接执行一次)。

2,等待minEvictableIdleTimeMillis时间后,池中线程被认为是空闲线程,可以被空闲线程检测到,检测频率为timeBetweenEvictionRunsMillis。每次检测numTestsPerEvictionRun个连接,并从线程池中清空该连接,直到当前连接数等于minIdle。检测过程不会执行特定sql,而是直接quit,直接关闭连接。

3,已经检测过的链接,会冷却minEvictableIdleTimeMillis时间,之后又会被空闲线程检测到,但是不会被清空,因为此时当前连接数等于minIdle,不能再清空。这个过程会执行特定sql,目的是校验连接有效性。

4,线程被等待minEvictableIdleTimeMillis的时间内,如果设置了<property name="testWhileIdle" value="true" /> 和<property name="validationQuery" value="SELECT 2 FROM DUAL"/>  属性,则每隔timeBetweenEvictionRunsMillis时间就执行一次validationQuery的sql,执行的次数为numTestsPerEvictionRun值,直到冷却时间结束,执行特定校验sql。如果没有设定testWhileIdle和validationQuery,则在冷却期间不会执行任何语句。可以理解为testWhileIdle(包括testOnBorrow,testOnReturn)是对数据库连接的一个辅助校验,避免数据库异常关闭连接等导致的链接失效而池不知道。

5,timeBetweenEvictionRunsMillis参数很有用,如果没有该参数,则minEvictableIdleTimeMillis时间后,不会进行连接有效性校验,此时如果数据库因该连接超时被关闭,则该空连接会导致程序异常(数据池提供了无效的数据库连接)

推荐设置:

1,minEvictableIdleTimeMillis:该参数和数据库的interactive_timeout(关闭交互连接的等待时间),wait_timeout(关闭非交互连接的等待时间)参数对应,不能大于数据库的这两个参数参数。如果大于数据库的参数,会导致池中有无效连接。

2,关闭定时检验语句可以减小数据库压力。或者开启testWhileIdle默认,空闲时执行。

3,建议开启防泄漏配置,可以检查程序是否存在连接泄漏问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: