问题
使用阿里巴巴的数据库连接池Druid,当应用程序连接数据库,老是报错:caused by wait mills 5000,active 0,maxactive 20
连接数据库超时,但是使用单独的jdbc连接却是可以连接的。
解决
经过反复测试,发现问题所在,原来是连接池参数<property name="validationQuery" value="select 1">
配置错误。虽然是配置错误,但是连接池版本是1.0.10,太旧,
导致没有把真正的报错提示出来ora-00923 未找到要求的关键字from
,而是报这个错:caused by wait mills 5000,active 0,maxactive 20
。也就是说,本来是因为配置错误导致的,
但是因为阿里巴巴连接池DruidDataSource的bug,把这个错误隐藏起来了,一直没有把真正的错误报出来。
总结
将Druid版本升级到最新的稳定版本,DruidDataSource配置成如下:
1 | <property name="minIdle" 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–连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒。