我正在使用hikaricp(这可能也适用于任何其他数据库连接池)。我有一个DBPool类,我在其中实例化HikariDataSource(使用HikariConfig对象)。我正在使用这个DBPool的惰性持有者习惯用法来限制每个VM的一个池实例。但是,一旦获得对池的引用,就可以检索Connection对象(没有任何进一步的锁/同步/信号量检查),因为我认为连接池将处理我的连接对象限制。 Evertime我通过DBPool获取连接引用,我在connection / preparedstatement / resultset上调用close。如果引起问题,我可以试试资源。 我在日志中观察以下内容:
2014-09-14 18:53:25,302 WARN c.z.h.p.LeakTask [Hikari Housekeeping Timer (pool testHikariCp)] Connection leak detection triggered, stack trace follows java.lang.Exception
at com.akkadian.db.DBConnPool.getConnection(DBConnPool.java:67)
at models.tester.storeload.testAlertLogStoreLoad.loadAll(testAlertChk.java:101)
at com.testLib.map.MapStoreWrapper.loadAll(MapStoreWrapper.java:131)
at com.testLib.map.mapstore.AbstractMapDataStore.loadAll(AbstractMapDataStore.java:40)
at com.testLib.map.BasicRecordStoreLoader$MapLoadAllTask.run(BasicRecordStoreLoader.java:340)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.testLib.util.executor.CompletableFutureTask.run(CompletableFutureTask.java:57)
at com.testLib.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:209)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.testLib.util.executor.testLibManagedThread.executeRun(testLibManagedThread.java:76)
at com.testLib.util.executor.testLibManagedThread.run(testLibManagedThread.java:92)
我增加了连接超时并设置了leakDetectionthreshold,如下所示:
hikariConfig.setConnectionTimeout(90000);
hikariConfig.setLeakDetectionThreshold(10000);
我也增加了游泳池的大小,即使建议不要 - 我必须测试各种选项,因为我从数据库接收连接超时。
答案 0 :(得分:1)
确保您确实将连接释放回池中?你可以尝试使用资源(除了提高Brett提到的门槛):
try (Connection conn = DBConnectionPool.getConnection();
PreparedStatement ps = conn.prepareStatement(preparedQuery);) {
和结果集(因为某些驱动程序/数据库在清除连接时可能无法清除结果集,但不确定这对于新驱动程序/数据库是否仍然有效,但我不确定您使用的是什么):
尝试(ResultSet rs = ps.executeQuery();){
如果需要,增加泄漏检测阈值,但我认为如果你必须使它太大,你就有一个需要修复的问题。