记录阿里巴巴连接池DruidDataSource的一个bug

问题:应用程序连接数据库,老是报一个错误: caused by wait millis 5000 ,active 0,maxactive 20

连接不上数据库超时。但是我用一个单独的jdbc在问题机器上测试连接数据库,发现却是可以连接的。


二、解决问题:

        后来经过曲折的探索过程,反复测试,发现 查找问题,发现是连接池参数 配置错误。虽然配置错误,但是连接池版本是1.0.10,太旧(2014年的),没有把真正的报错提示出来“ora-00923 未找到要求的关键字from”,而是报这个错误:“ caused by wait millis 5000 ,active 0,maxactive 20”。也就是说,本来配置出错,但是因为阿里巴巴连接池DruidDataSource的bug,把这个错误隐藏起来,一直没有报错。或者说,一直没有把真正的错误报出来。本来是一个很简单的错误。换成1.1.6,错误出现了:

一看这个错误,就很明白了:因为“”ora-00923 未找到要求的关键字from”导致“caused by wait millis 5000 ,active 0,maxactive 20” 连接超时问题。

三。总结:最后建议DruidDataSource配置成如下:

升级到最新稳定版本

四。另外有几个参数的意思是:

 validationQuery   SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,
则查询必须是一个SQL SELECT并且必须返回至少一行记录
testOnBorrow  true  指明是否在从池中取出连接前进行检验,如果检验失败,
则从池中去除连接并尝试取出另一个.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testOnReturn  false  指明是否在归还到池中前进行检验
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testWhileIdle  false  指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,
则连接将被从池中去除.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
timeBetweenEvictionRunsMillis  -1  在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.
 如果设置为非正数,则不运行空闲连接回收器线程
numTestsPerEvictionRun  3  在每次空闲连接回收器线程(如果有)运行时检查的连接数量
minEvictableIdleTimeMillis  1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程
(如果有)回收的最小时间值,单位毫秒

请使用浏览器的分享功能分享到微信等