5

我一直在使用 Play 2.0.2 来创建 Java 应用程序。这几天我遇到了一个问题。在 ~100 请求之后,服务器开始抛出这个异常:

[[SQLException: 等待空闲可用连接超时。]]

我创建了一个Connectionwith的新实例DB.getConnection()。我不关闭Connection实例,因为每个请求只有一个实例,据我所知,它会Connection在活动 TCP 连接关闭时自动关闭实例。我试图增加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]
4

3 回答 3

3

你提到:

我没有关闭 Connection 实例,因为每个请求只有一个实例

这是错误的,你必须关闭它,否则你最终会遇到你看到的问题。

原因是您获得的是直接 JDBC 连接,而不是由 ORM(EBeans 或其他符合 JPA 的)管理的连接,因此如果您不关闭它,连接可能会悬空一段时间。

于 2012-12-03T11:54:40.990 回答
1

使用 DB.withConnection,一旦完成,它就会关闭连接。

于 2012-12-03T13:41:08.173 回答
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();
}
于 2014-07-24T09:31:21.540 回答