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,建议开启防泄漏配置,可以检查程序是否存在连接泄漏问题。
说明:不是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,建议开启防泄漏配置,可以检查程序是否存在连接泄漏问题。
相关文章推荐