Play2.0 возвращает SQLException: истекло время ожидания свободного доступного соединения.

Я использую Play 2.0.2 для создания приложения Java. На днях столкнулся с проблемой. После ~100 запросов сервер начинает выдавать это исключение:

[[SQLException: истекло время ожидания свободного доступного соединения.]]

Я создаю новый экземпляр Connection с 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]

person burak emre    schedule 02.12.2012    source источник
comment
Насколько я знаю, вы должны закрыть соединение после использования (например, в блоке finally)   -  person ndeverge    schedule 02.12.2012
comment
stackoverflow.com/questions/16275102/   -  person Abhishek Mishra    schedule 08.02.2015


Ответы (3)


Вы упоминаете, что:

Я не закрываю экземпляры Connection, потому что есть только один экземпляр каждого запроса.

Это неправильно, вы должны закрыть его, иначе вы столкнетесь с проблемой, которую видите.

Причина в том, что вы получаете прямое соединение JDBC, а не соединение, управляемое ORM (EBeans или какой-либо другой JPA-совместимый), поэтому, если вы не закроете его, соединение может какое-то время зависнуть.

person Pere Villega    schedule 03.12.2012
comment
@привет Пере Вильега, у меня та же проблема stackoverflow.com/questions/24527954/ Не могли бы вы решить эту проблему. Я использую ORM и все еще сталкиваюсь с проблемой. - person Incpetor; 13.08.2014

Используйте DB.withConnection, он закрывает соединение после его завершения.

person Jakob    schedule 03.12.2012
comment
Кажется, DB.withConnection доступен только для Scala. - person burak emre; 04.12.2012

Java-реализация Play framework для базы данных должна быть примерно такой.

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();
}
person Incpetor    schedule 24.07.2014