我有一个应用程序,一个在JDK 1.8上运行的Java进程。我们将Oracle 12用作数据库,并将commons-dbcp:1.2.2库用于连接池。 这个Java进程是一个多线程应用程序,一旦完成一个线程的数据库查询,它就会释放数据库连接。连接从活动变为空闲。但它会在那里停留30-40分钟,然后再退出空闲状态。
我打印了org.apache.commons.pool.impl.GenericObjectPool的各种属性
numActive = 25
maxActive = 20
numIdle = 8
maxIdle = 20
minIdle = 0
testOnBorrow = true
testOnReturn = false
maxWait = 2000
minEvictableIdleTimeMillis = 5000
numTestsPerEvictionRun = 5
softMinEvicatbleIdleTime = -1
testWhileIdle = true
timeBetweenEvictionRunsMillis = 10000
whenExhaustedAction = grow
根据上述数字,根据GenericObjectPool https://commons.apache.org/proper/commons-pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html
的文档退出线程应每10秒运行一次,并声明所有8个空闲连接。但是实际上这是没有发生的。实际上,半小时后到40分钟,1个空闲连接被断开。
如何进一步调试?有没有一种方法可以找出退出线程正在运行的时间(某些日志或其他内容)。以及如何确保闲置连接在不使用时很快消失。