2014-10-28 81 views
4

在具有两个子项目一个播放项目HikariCP连接的时候,我们正在努力HikariCP,它似乎并没有要释放连接返回到池中,并抛出这个异常:播放 - 释放回池

java.sql.SQLException: Timeout of 30000ms encountered waiting for connection. 

下面是调试后显示六个简单的查询:

[DEBUG] c.z.h.p.HikariPool - Before cleanup pool stats pool1 (total=5, inUse=5, avail=0, waiting=1) 
[DEBUG] c.z.h.p.HikariPool - After cleanup pool stats pool1 (total=5, inUse=5, avail=0, waiting=1) 
[DEBUG] c.z.h.p.HikariPool - Timeout failure pool stats pool1 (total=5, inUse=5, avail=0, waiting=0) 
[ERROR] application - Error in datastore operation detected. 
java.sql.SQLException: Timeout of 30000ms encountered waiting for connection. 
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:207) ~[HikariCP-java6-2.0.1.jar:na] 
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:93) ~[HikariCP-java6-2.0.1.jar:na] 
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
[DEBUG] c.z.h.p.HikariPool - Before cleanup pool stats pool1 (total=5, inUse=4, avail=1, waiting=0) 
[DEBUG] c.z.h.p.HikariPool - After cleanup pool stats pool1 (total=5, inUse=4, avail=1, waiting=0) 

我们正在使用有两个游泳池和版本2级的Postgres数据库是:

Play: 2.3.3 
Scala: 2.11.1 
HikariCP: 2.0.1 
Play-hikaricp: 1.4.1 
Postgres: 9.3 

UPDATE:

启用泄漏检测(leakDetectionThreshold = 10000)生成下列警告:

[WARN] c.z.h.p.LeakTask - Connection leak detection triggered, stack trace follows 
java.lang.Exception: null 
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:389) ~[slick_2.11-2.1.0.jar:0.8.0] 
[WARN] c.z.h.p.LeakTask - Connection leak detection triggered, stack trace follows 
java.lang.Exception: null 
    at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$3.createConnection(JdbcBackend.scala:47) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:397) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:152) ~[slick_2.11-2.1.0.jar:0.8.0] 
    at scala.slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:389) ~[slick_2.11-2.1.0.jar:0.8.0] 
+0

这可能是一个Slick配置问题,可能是由于在获得连接后延迟查询执行。我建议启用泄漏检测,以查看是否有线程挂在连接上而没有及时返回池(> 10秒)。 – brettw 2014-10-29 00:00:28

+1

@brettw:谢谢。我更新了这个问题。这究竟意味着什么?我注意到有两个数据库/池的其他用户也有类似的问题。 – centr 2014-10-29 00:41:15

回答

3

正如我在bug report在github说,这似乎是answered here。我不是一名玩/开发者,所以我不知道底层的问题是什么。但我知道这不是HikariCP中的一个错误。已关闭的连接立即返回到池中。

像Scala这样的异步系统,如果在访问可以阻塞的资源时没有正确使用,可能会产生开始遭受资源超时影响的挂起执行任务的积压。这通常是由单独的线程执行池来阻止访问。我希望将这种东西连接到Slick框架,但正如我上面所说的,我对Slick并不熟悉。

+0

手动关闭会话解决了问题。我希望Slickians会为此提供一个更简单的方法。感谢您做的伟大工作。 – centr 2014-10-29 17:58:19

+0

@centr只是想知道这是否是一个可持续的解决方案。长期以来这对你有用吗? – 2016-04-13 23:09:05