druid 参数配置详解
Table of Contents
1 初始化连接
在druid连接数据库的配置文件中,读写datasource的bean中 要有 init-method="init". 配置,否则在启动连接池时不会执行初始化操作。 示例:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> ....... </bean>
2 参数配置及说明
通过 spring 配置文件application-context.xml中的dataSource配置说明各个参数的配置。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- ”连接“的基本属性 url、user、password --> <!-- jdbc url: <property name="url" value="jdbc_url" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 启动druid时,同步建立 N 个连接--> <property name="initialSize" value="100" /> <!-- 连接池中最多有 N 个活动连接 --> <property name="maxActive" value="1000" /> <!-- 程序向连接池请求连接这一操作的最大等待时间,超过该时限后, 认为本次失败,即连接池没有可用连接,将退出请求操作,单位毫秒,设置为-1时表示无限等待 --> <property name="maxWait" value="60000" /> <!-- 连接池回收空闲连接的机制,包括检查和回收两部分 --> <!-- 检查范围: 连接的空闲时长大于N毫秒后,将被连接池考虑回收。该参数决定了回收机制的检查范围 --> <property name="minEvictableIdleTimeMillis" value=300000 /> <!-- 检查频率: 检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查。 --> <property name="timeBetweenEvictionRunsMillis" value=-1 /> <!-- 回收限制条件1: 回收空闲连接时,将保证至少有N个空闲连接 --> <property name="minIdle" value="20" /> <!-- 开启强制回收连接功能,强制回收连接要求程序在get到连接后的N秒内必须close连接,否则druid会强制中止该连接,不管该连接中是否有事务在运行。 --> <property name="removeAbandoned" value="true"/> <!-- 当程序get到一个连接后,在 N 秒内必须 Close,否则连接池也会弄死它, 需要考虑一个合理的值,避免业务跑不完--> <property name="removeAbandonedTimeout" value="180"/> <!-- 当连接池强制中止程序连接后,是否将stack trace记录到日志中 --> <property name="logAbandoned" value="true" /> <!-- 基本所有关系型 数据库都会将长时间的空闲连接强制断开。但是该连接在连接池中仍存在。程序获取这些被断开的连接时会报错 --> <!-- 下面四个参数是用于检查连接是否有效,是否可用 --> <!-- 开启对空闲连接的有效性检测 --> <property name="testWhileIdle" value="true" /> <!-- 确认连接是否有效的SQL --> <property name="validationQuery" value="SELECT ‘x‘" /> <!-- 下面两个参数影响性能, 不建议使用 --> <!-- 程序获取连接池中的连接时进行检测 --> <property name="testOnBorrow" value="false" /> <!-- 程序归还连接时,检测连接是否仍有效 --> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <!-- 通过方法 * public PreparedStatement prepareStatement(String sql) 及yyif * public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)创建的将被缓存 --> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <!--配置监控统计拦截的filters,属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat;日志用的filter:log4j;防御SQL注入的filter:wall --> <property name="filters" value="stat,wall,slf4j"/> <!-- 通过connectProperties属性来打开mergeSql功能;慢SQL记录--> <property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000" /> </bean>
3 注意事项
3.1 底层连接
另外还有一个参数 accessToUnderlyingConnectionAllowed. 该参数设置是否允许使用底层连接。 如果设置为true,可以使用下面的方式来获取底层连接:
Connection conn = ds.getConnection(); Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); ... conn.close();
默认false不开启, 因为代码逻辑不正确,可能会带来风险。建议需要直接访问驱动的特定功能时再使用,并且经过多次测试, 明确代码每一步可能带来的风险。
3.2 空闲检查问题
在使用阿里的SLB时,建议将timeBetweenEvictionRunsMillis设置为2秒或者负值(关闭检查机制)。否则,连接进程会报:
Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicaiotnsException: Communications link failure