pom引入 1 2 3 4 5 <dependency > <groupId > com.alibaba</groupId > <artifactId > druid</artifactId > <version > 1.0.18</version > </dependency >
初始化连接 在druid连接数据库的配置文件中,读写datasource的bean中 要有 init-method=”init” . 配置,否则在启动连接池时不会执行初始化操作。
示例:
1 2 3 <bean id ="dataSource" class ="com.alibaba.druid.pool.DruidDataSource" init-method ="init" destroy-method ="close" > ....... </bean >
参数配置及说明 通过 spring 配置文件application-context.xml中的dataSource配置说明各个参数的配置。
属性
说明
建议值
url
数据库的jdbc连接地址。一般为连接oracle/mysql。示例如下:
mysql : jdbc:mysql://ip:port/dbname?option1&option2&…
oracle : jdbc:oracle:thin:@ip:port:oracle_sid
username
登录数据库的用户名
password
登录数据库的用户密码
initialSize
启动程序时,在连接池中初始化多少个连接
10-50已足够
maxActive
连接池中最多支持多少个活动会话
maxWait
程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池
100
没有可用连接,单位毫秒,设置-1时表示无限等待
minEvictableIdleTimeMillis
池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将
见说明部分
回收该连接,要小于防火墙超时设置
net.netfilter.nf_conntrack_tcp_timeout_established的设置
timeBetweenEvictionRunsMillis
检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查
keepAlive
程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执
true
行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超
过minIdle指定的连接个数。
minIdle
回收空闲连接时,将保证至少有minIdle个连接.
与initialSize相同
removeAbandoned
要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该
false,当发现程序有未
连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。
正常close连接时设置为true
removeAbandonedTimeout
设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此
应大于业务运行最长时间
值后,druid将强制回收该连接,单位秒。
logAbandoned
当druid强制回收连接后,是否将stack trace 记录到日志中
true
testWhileIdle
当程序请求连接,池在分配连接时,是否先检查该连接是否有效。(高效)
true
validationQuery
检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL默认值每种数据库都不相同:Mysql:SELECT 1; SQLSERVER:SELECT 1; ORACLE:SELECT ‘x’ FROM DUAL; PostGresql:SELECT ‘x’;
正常返回,则表示连接可用,否则表示连接不可用
testOnBorrow
程序 申请 连接时,进行连接有效性检查(低效,影响性能)
false
testOnReturn
程序 返还 连接时,进行连接有效性检查(低效,影响性能)
false
poolPreparedStatements
缓存通过以下两个方法发起的SQL:
true
public PreparedStatement prepareStatement(String sql)
public PreparedStatement prepareStatement(String sql,
int resultSetType, int resultSetConcurrency)
maxPoolPrepareStatementPerConnectionSize
每个连接最多缓存多少个SQL
20
filters
这里配置的是插件,常用的插件有:
stat,wall,slf4j
监控统计: filter:stat
日志监控: filter:log4j 或者 slf4j
防御SQL注入: filter:wall
connectProperties
连接属性。比如设置一些连接池统计方面的配置。
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
比如设置一些数据库连接属性:
注意事项 底层连接 另外还有一个参数 accessToUnderlyingConnectionAllowed. 该参数设置是否允许使用底层连接。 如果设置为true,可以使用下面的方式来获取底层连接:
1 2 3 4 5 6 7 Connection conn = ds.getConnection();Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate(); ... conn.close();
默认false不开启, 因为代码逻辑不正确,可能会带来风险。建议需要直接访问驱动的特定功能时再使用,并且经过多次测试, 明确代码每一步可能带来的风险。
空闲检查问题 在使用阿里的SLB时,建议将timeBetweenEvictionRunsMillis设置为2秒或者负值(关闭检查机制)。否则,连接进程会报:
1 Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicaiotnsException: Communications link failure
不同配置文件 其中 spring boot application.properties 中的配置最为完整,建议参考。
jdbc中配置连接池 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 jdbc.properties: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql: jdbc.username=test jdbc.password=test jdbc.filters=stat jdbc.maxActive=300 jdbc.initialSize=2 jdbc.maxWait=60000 jdbc.minIdle=1 jdbc.timeBetweenEvictionRunsMillis=60000 jdbc.minEvictableIdleTimeMillis=300000 jdbc.validationQuery=SELECT 'x' jdbc.testWhileIdle=true jdbc.testOnBorrow=false jdbc.testOnReturn=false jdbc.poolPreparedStatements=false jdbc.maxPoolPreparedStatementPerConnectionSize=50
spring中配置druid 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <bean id ="dataSource" class ="com.alibaba.druid.pool.DruidDataSource" init-method ="init" destroy-method ="close" > <property name ="url" value ="jdbc_url" /> <property name ="username" value ="${jdbc_user}" /> <property name ="password" value ="${jdbc_password}" /> <property name ="initialSize" value ="100" /> <property name ="maxActive" value ="1000" /> <property name ="maxWait" value ="60000" /> <property name ="minEvictableIdleTimeMillis" value =300000 /> <property name ="keepAlive" value =true /> <property name ="timeBetweenEvictionRunsMillis" value =-1 /> <property name ="minIdle" value ="20" /> <property name ="removeAbandoned" value ="true" /> <property name ="removeAbandonedTimeout" value ="180" /> <property name ="logAbandoned" value ="true" /> <property name ="testWhileIdle" value ="true" /> <property name ="validationQuery" value ="SELECT 'x'" /> <property name ="testOnBorrow" value ="false" /> <property name ="testOnReturn" value ="false" /> <property name ="poolPreparedStatements" value ="true" /> <property name ="maxPoolPreparedStatementPerConnectionSize" value ="20" /> <property name ="filters" value ="stat,wall,slf4j" /> <property name ="connectionProperties" value ="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000" /> </bean >
spring boot application.properties配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #驱动配置信息 spring.datasource.driver-class-name=com.mysql.jdbc.Driver #基本连接信息 spring.datasource.username = root spring.datasource.password = root spring.datasource.url=jdbc:mysql: #连接池属性 spring.datasource.druid.initial-size=15 spring.datasource.druid.max-active=100 spring.datasource.druid.min-idle=15 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.test-on-borrow=false spring.datasource.druid.test-on-return =false spring.datasource.druid.test-while -idle=true spring.datasource.druid.validation-query=SELECT 1 spring.datasource.druid.validation-query-timeout=1000 spring.datasource.druid.keep-alive=true spring.datasource.druid.remove-abandoned=true spring.datasource.druid.remove-abandoned-timeout=180 spring.datasource.druid.log-abandoned=true spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 spring.datasource.druid.filters=stat,wall,slf4j spring.datasource.druid.use-global-data-source-stat=true spring.datasource.druid.preparedStatement=true spring.datasource.druid.maxOpenPreparedStatements=100 spring.datasource.druid.connect-properties.mergeSql=true spring.datasource.druid.connect-properties.slowSqlMillis=5000