问题:应用程序连接数据库,老是报一个错误: caused by wait millis 5000 ,active 0,maxactive 20
连接不上数据库超时。但是我用一个单独的jdbc在问题机器上测试连接数据库,发现却是可以连接的。
二、解决问题:
后来经过曲折的探索过程,反复测试,发现 查找问题,发现是连接池参数<property name="validationQuery" value="SELECT 1" /> 配置错误。虽然配置错误,但是连接池版本是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配置成如下:
升级到最新稳定版本
<property name="minIdle" value="1" />
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="testOnBorrow" value="true" />
<property name="poolPreparedStatements" value="true" />
<property name="initialSize" value=1 />
四。另外有几个参数的意思是:
validationQuery SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,
则查询必须是一个SQL SELECT并且必须返回至少一行记录
testOnBorrow true 指明是否在从池中取出连接前进行检验,如果检验失败,
则从池中去除连接并尝试取出另一个.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testOnReturn false 指明是否在归还到池中前进行检验
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testWhileIdle false 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,
则连接将被从池中去除.
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
timeBetweenEvictionRunsMillis -1 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位.
如果设置为非正数,则不运行空闲连接回收器线程
numTestsPerEvictionRun 3 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
minEvictableIdleTimeMillis 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程
(如果有)回收的最小时间值,单位毫秒
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30393770/viewspace-2212899/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30393770/viewspace-2212899/