为何要设置数据库连接池的 超时等待时间

时间:2021-01-02 17:11:27

先说问题背景:程序有多线程调用,有大量的数据库交互

遇到的问题:程序运行一段时间之后hung 住了,没有异常抛出,也不继续执行

因为有多线程调用,因此无法快速准确的定位问题:是线程问题还是其他代码逻辑问题

后来发现是数据库连接的问题:由于有段代码数据库连接没有释放,导致数据库连接池的连接被占满,后续的申请持续等待

定位问题过程:

(1) 加上了数据库连接池超时等待时间的设置 -- 如果超时,则抛出异常,可以定位是数据库连接池的问题

(2) 在log 中打印当前active 的连接数 (BasicDataSource 中的getNumActive() 方法)-- 可以得出不是连接池连接数的不够,而是由于active 的 connection 持续在增加,得到代码中有未释放连接的结论

(3) 查找代码,释放连接


这个问题查找了小一天。如果开始就把最大等待时间加上,那么可能很快就可以定位到问题所在。


以下是basicDatasource 的参数 以及解释,留作参考

dbcp.BasicDataSource

1、<-- 初始化连接 -->

initialSize=10 2、 #

2 <-- 最大空闲连接 -->

 maxIdle=20 3、 #

3 <-- 最小空闲连接 -->

minIdle=5

4、#最大连接数量 maxActive=50

5、#是否在自动回收超时连接的时候打印连接的超时错误 logAbandoned=true

6、#是否自动回收超时连接 removeAbandoned=true

7、#超时时间(以秒数为单位) removeAbandonedTimeout=180

8、 #<-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->

maxWait=1000