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

问题

使用阿里巴巴的数据库连接池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
2
3
4
5
6
7
8
9
<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 />

参数说明

  1. validationQuery

SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定, 则查询必须是一个SQL SELECT并且必须返回至少一行记录。

  1. testOnBorrow

true–指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个。

注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 。

  1. testOnReturn

false–指明是否在归还到池中前进行检验。

注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 。

  1. testWhileIdle

false–指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败, 则连接将被从池中去除。

注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串

  1. timeBetweenEvictionRunsMillis

-1–在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程。

  1. numTestsPerEvictionRun

3–在每次空闲连接回收器线程(如果有)运行时检查的连接数量 。

  1. minEvictableIdleTimeMillis

1000 * 60 * 30–连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒。

本文标题:阿里巴巴连接池DruidDataSource的一个bug

文章作者:王洪博

发布时间:2019年03月18日 - 09:03

最后更新:2019年09月12日 - 10:09

原始链接:http://whb1990.github.io/posts/d2af9ee0.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%