druid 教程 connection holder is null

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenaini119/article/details/80402273

、proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。

首先从http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的jar包。如果想使用最新的源码编译,可以从https://github.com/alibaba/druid 下载源码,然后使用maven命令行,或者导入到eclipse中进行编译。

1 配置

和dbcp类似,druid的常用配置项如下
这里写图片描述
这里写图片描述
这里写图片描述

表1.1 配置属性

表1.1仅仅列出了常用配置属性,完整的属性列表可以参考代码类DruidDataSourceFactory 的ALL_PROPERTIES属性,根据常用的配置属性,首先给出一个如下的配置文件,放置于src目录下。

[plain] view plain copy

url:jdbc:mysql://localhost:3306/dragoon_v25_masterdb  
driverClassName:com.mysql.jdbc.Driver  
username:root  
password:aaaaaaaa  

filters:stat  

maxActive:20  
initialSize:1  
maxWait:60000  
minIdle:10  
#maxIdle:15  

timeBetweenEvictionRunsMillis:60000  
minEvictableIdleTimeMillis:300000  

validationQuery:SELECT 'x'  
testWhileIdle:true  
testOnBorrow:false  
testOnReturn:false  
#poolPreparedStatements:true  
maxOpenPreparedStatements:2

0
配置文件1.1

配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。

同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候可以设置一个testWhileIdle参数为true,注意这里的“while”这个单词应该翻译成“如果”,换句话说testWhileIdle写为testIfIdle更好理解些,其含义为连接在获取连接的时候,如果检测到当前连接不活跃的时间超过了timeBetweenEvictionRunsMillis,则去手动检测一下当前连接的有效性,在保证确实有效后才加以使用。在检测活跃性时,如果当前的活跃时间大于minEvictableIdleTimeMillis,则认为需要关闭当前连接。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在每次获取Connection对象时都检测其可用性),不过这样会影响性能。

最后说一下removeAbandoned参数,其实druid是不能检测到当前使用的连接是否发生了连接泄露,所以在代码内部就假定如果一个连接建立连接的时间很长,则将其认定为泄露,继而强制将其关闭掉。这个参数在druid中默认是不开启的,github上给出的wiki中也对其没有丝毫提及。其实在代码中设置testWhileIdle就能在一定程序上消灭掉泄露的连接,因为如果发生了泄露,那么他的不活跃时间肯定会在某个时间点大于timeBetweenEvictionRunsMillis,继而被回收掉。

connection holder is null 问题分析

removeAbandoned
对于建立时间超过removeAbandonedTimeout的连接强制关闭
removeAbandonedTimeout
指定连接建立多长时间就需要被强制关闭
logAbandoned
指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中
这三个一定要配置在文件中,当出现问题的时候回打印日志定位到连接池泄露的地方。

最后定位出来问题
数据库连接池泄露 DaCsCaseMainQueryDao DaCsCollectionRecDao 两个dao被action直接调用
没有用service包食物,hibernnate 里面的这种操作会发生连接池泄露

配合这个一起看看
连接池区别

猜你喜欢

转载自blog.csdn.net/chenaini119/article/details/80402273