2014-10-28 8 views
4

다시 발표 HikariCP 연결하지, 우리는 HikariCP을 시도하고 풀에 다시 연결을 해제하는 것과하지 않는 것은이 예외를 throw 여기 디버그 후 여섯 개 간단한 쿼리 보여줍니다 무엇 : 우리는 2 개 개의 수영장과 버전 이 개 포스트 그레스 데이터베이스를 사용하는재생이 하위 프로젝트가있는 재생 프로젝트에서 풀

[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) 

은 다음과 같습니다

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

+1

@brettw : 감사합니다. 나는 그 질문을 갱신했다. 이것이 정확히 무엇을 의미합니까? 두 개의 데이터베이스가있는 다른 사용자/풀에도 비슷한 문제가 있음을 발견했습니다. – centr

답변

3

I는 GitHub의에 bug report에서 말했듯이 answered here 것으로 보인다. 나는 Play/매끄러운 개발자가 아니기 때문에 기본적인 문제가 무엇인지 알지 못합니다. 하지만 그것이 HikariCP의 버그가 아니라는 것을 알고 있습니다. 닫힌 연결은 즉시 풀로 반환됩니다.

스칼라와 같은 비동기 시스템은 차단할 수있는 리소스에 액세스 할 때 제대로 사용되지 않으면 리소스 시간 제한으로 인해 어려움을 겪을 수있는 보류중인 실행 작업의 백 로그를 개발할 수 있습니다. 이것은 일반적으로 액세스를 차단하기 위해 별도의 스레드 실행 풀에 의해 조정됩니다. 슬릭 프레임 워크에 연결되는 것을 기대할 수 있지만, 위에서 말했듯이 나는 슬릭을 잘 알지 못한다.

+0

세션을 수동으로 닫으면 문제가 해결되었습니다. 나는 Slickians이 이것을 위해 더 쉬운 길을 포함하기를 바란다. 위대한 업적을 가져 주셔서 감사합니다. – centr

+0

@centr 지속 가능한 솔루션인지 궁금합니다. 장기간 당신에게 도움이 되었습니까? –