我在heroku上有一个使用play的应用程序.它工作时间最长,但最近我开始得到这个:
Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) ~[hibernate-core-4.1.9.Final.jar:4.1.9.Final]
at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:503) ~[bonecp-0.7.1.RELEASE.jar:0.7.1.RELEASE]
Run Code Online (Sandbox Code Playgroud)
这是由
org.postgresql.util.PSQLException: FATAL: too many connections for role "ejmatdbwywaugk"
Run Code Online (Sandbox Code Playgroud)
现在这显然是一个连接泄漏,除了我正在使用JPA.em().Play示例永远不会关闭像这样获得的实体管理器.我尝试关闭它,但随后应用程序爆炸说实体经理已关闭.
有任何想法吗?
阅读Play-Slick DBAction代码,我认为此代码可能包含竞争条件:
object DBAction{
// snip
def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = {
Action { implicit request =>
AsyncResult {
DB.withSession{ s:scala.slick.session.Session =>
Future(r( RequestWithDbSession(request,s) ))(executionContext)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该函数r在将来withSession返回Future [Result]并调用之后运行session.close().这段代码中是否存在竞争条件?