我一直在使用Play 2.0.2来创建Java应用程序。几天我遇到了问题。在~100请求之后,服务器开始抛出此异常:
[[SQLException:等待免费可用连接超时。]]
我使用Connection
创建了DB.getConnection()
的新实例。我没有关闭Connection
实例,因为每个请求只有一个实例,据我所知,当活动TCP连接关闭时,它会自动关闭Connection
个实例。
我尝试将db.default.connectionTimeout
值增加到100 seconds
,但无法解决问题。然后我检查了活动的Postgresql连接,并且没有活动连接。我也重新启动了Postgresql,但它也无法解决问题。
现在解决这个问题的唯一方法是杀死Play20实例并启动一个新实例。
这是Play2.0创建的日志:
! @6cg9il6ki - Internal server error, for request [GET [AN URL]] ->
play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[SQLException: Timed out waiting for a free available connection.]]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.2]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.2]
at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2]
at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.2]
at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2]
Caused by: java.sql.SQLException: Timed out waiting for a free available connection.
at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:503) ~[bonecp.jar:0.7.1.RELEASE]
at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:114) ~[bonecp.jar:0.7.1.RELEASE]
at play.api.db.DBApi$class.getConnection(DB.scala:64) ~[play_2.9.1.jar:2.0.2]
at play.api.db.BoneCPApi.getConnection(DB.scala:273) ~[play_2.9.1.jar:2.0.2]
at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129) ~[play_2.9.1.jar:2.0.2]
at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129) ~[play_2.9.1.jar:2.0.2]
答案 0 :(得分:3)
你提到:
我没有关闭Connection实例,因为只有一个 每个请求的实例
这是错的,你必须关闭它,否则你最终会遇到你看到的问题。
原因是您正在获得直接的JDBC连接,而不是由ORM管理的连接(EBeans或其他一些JPA兼容的),因此如果您不关闭它,连接可能会暂停一段时间。
答案 1 :(得分:1)
使用DB.withConnection,它会在完成后关闭连接。
答案 2 :(得分:0)
Play框架Java实现应该是这样的。
try{
Ebean.beginTransaction();
// your code goes here
// if all things go fine
Ebean.commitTransaction();
}catch (Exception e){
//got error so log it.
e.printStackTrace();
}finally{
//End the transactions started
Ebean.endTransaction();
}