2014-10-28 78 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