Проблема с подключением к БД с Playframework 2.1 и Bonecp 0.8.0: это подключение было закрыто

У меня возникла проблема с Bonecp 0.7.1 в приложении Playframework с использованием postgresql 9.2.4 на Heroku. Кажется, в этой версии была утечка соединения с БД, что привело к следующей ошибке после нескольких обращений к БД:

[error] c.j.b.h.AbstractConnectionHook - Failed to acquire connection Sleeping for 1000ms and trying again. Attempts left: 1. Exception: null.Message:FATAL: too many connections for role "eonqhnjenuislk" Database warning
[error] c.j.b.PoolWatchThread - Error in trying to obtain a connection. Retrying in 1000ms
org.postgresql.util.PSQLException: FATAL: too many connections for role "eonqhnjenuislk"
at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:469) ~[postgresql-9.1-901.jdbc4.jar:na]
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:112) ~[postgresql-9.1-901.jdbc4.jar:na]
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) ~[postgresql-9.1-901.jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125) ~[postgresql-9.1-901.jdbc4.jar:na]
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30) ~[postgresql-9.1-901.jdbc4.jar:na]
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22) ~[postgresql-9.1-901.jdbc4.jar:na]

Поскольку все потоки пула соединений были получены и сохранены, приложение больше не было доступно, пока я не перезапустил его.

Затем я услышал, что эта проблема была исправлена ​​в Bonecp 0.8.0, поэтому я обновил библиотеку. Но проблема, кажется, не полностью решена. Фактически, теперь потоки подключения больше не сохраняются, что делает приложение доступным в любое время, но иногда соединение с БД внезапно закрывается... Приложение выдает следующую ошибку, вызывающую ошибку 500 для конечных пользователей:

javax.persistence.PersistenceException: org.postgresql.util.PSQLException: This connection has been closed.
at com.avaje.ebeaninternal.server.transaction.TransactionManager.createTransaction(TransactionManager.java:331)
at com.avaje.ebeaninternal.server.core.DefaultServer.createServerTransaction(DefaultServer.java:2056)
at com.avaje.ebeaninternal.server.core.BeanRequest.createImplicitTransIfRequired(BeanRequest.java:58)
at com.avaje.ebeaninternal.server.core.PersistRequest.initTransIfRequired(PersistRequest.java:81)
at com.avaje.ebeaninternal.server.persist.DefaultPersister.executeSqlUpdate(DefaultPersister.java:146)
at com.avaje.ebeaninternal.server.core.DefaultServer.execute(DefaultServer.java:1928)
at com.avaje.ebeaninternal.server.core.DefaultServer.execute(DefaultServer.java:1935)
at com.avaje.ebeaninternal.server.core.DefaultSqlUpdate.execute(DefaultSqlUpdate.java:148)
at actor.PublicParkingPlacesActor$1.apply(PublicParkingPlacesActor.java:41)
at actor.PublicParkingPlacesActor$1.apply(PublicParkingPlacesActor.java:26)
at play.libs.F$Promise$PromiseActor.onReceive(F.java:425)
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:159)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
at akka.actor.ActorCell.invoke(ActorCell.scala:386)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
at akka.dispatch.Mailbox.run(Mailbox.scala:212)
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:502)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
Caused by: org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:714)
at org.postgresql.jdbc2.AbstractJdbc2Connection.setAutoCommit(AbstractJdbc2Connection.java:661)
at com.jolbox.bonecp.ConnectionHandle.setAutoCommit(ConnectionHandle.java:1292)
at play.api.db.BoneCPApi$$anon$1.onCheckOut(DB.scala:328)
at com.jolbox.bonecp.AbstractConnectionStrategy.postConnection(AbstractConnectionStrategy.java:75)
at com.jolbox.bonecp.AbstractConnectionStrategy.getConnection(AbstractConnectionStrategy.java:92)
at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:553)
at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:131)
at play.db.ebean.EbeanPlugin$WrappingDatasource.getConnection(EbeanPlugin.java:146)
at com.avaje.ebeaninternal.server.transaction.TransactionManager.createTransaction(TransactionManager.java:297)
... 20 more

Спасибо большое за вашу помощь!

ИЗМЕНИТЬ:

Конфигурация БД:

db.default.isolation=READ_COMMITTED
db.default.partitionCount=2
db.default.maxConnectionsPerPartition=10
db.default.minConnectionsPerPartition=5
db.default.acquireIncrement=1
db.default.acquireRetryAttempts=2
db.default.acquireRetryDelay=5 seconds
db.default.connectionTimeout=10 second
db.default.idleMaxAge=10 minute
db.default.idleConnectionTestPeriod=5 minutes
db.default.initSQL="SELECT 1"
db.default.maxConnectionAge=1 hour

РЕДАКТИРОВАТЬ 2:

Вот конфигурация БД, которую я установил в соответствии с этим сообщением Эти изменения уменьшают количество проблем "Это соединение было закрыто", но я все еще получаю 1 или 2 из них в день, что приводит к сбою некоторых HTTP-запросов. Итак, проблема до сих пор не решена:

db.default.isolation=READ_COMMITTED
db.default.partitionCount=2
db.default.maxConnectionsPerPartition=10
db.default.minConnectionsPerPartition=5
db.default.acquireIncrement=1
db.default.acquireRetryAttempts=2
db.default.acquireRetryDelay=5 seconds
db.default.connectionTimeout=10 seconds
db.default.idleMaxAge=10 minutes
db.default.idleConnectionTestPeriod=30 seconds
db.default.initSQL="SELECT 1"
db.default.maxConnectionAge=30 minutes

person Maxime    schedule 04.12.2013    source источник
comment
Можете ли вы показать свою конфигурацию БД? Попробуйте это решение. /15480506/   -  person Marco    schedule 05.12.2013
comment
Я добавил свою конфигурацию БД выше. Я установил значения в предоставленной вами ссылке и развернул приложение в тестовом экземпляре heroku. Я сообщу через несколько дней, если это решило проблему.   -  person Maxime    schedule 06.12.2013
comment
Это исправило @MaximeA?   -  person cdmckay    schedule 12.12.2013
comment
Нет, не совсем так, стало меньше предупреждений о закрытии соединения, но все же вы получаете 1 или 2 предупреждения в день вместо ~10 в день до изменения конфигурации БД. @MaFo, вы наконец поняли логику конфигурации, которую вы указали в своем комментарии выше? Кроме того, я добавил текущую конфигурацию БД, чтобы улучшить ее.   -  person Maxime    schedule 14.12.2013
comment
Я не уверен, но я думаю, что heroku автоматически закрывает каждое соединение через 30 секунд (также соединения db). Попробуйте установить maxConnectionAge на 30 секунд или меньше.   -  person Marco    schedule 16.12.2013
comment
Я установил maxConnectionAge на 30 секунд 3 дня назад, и с тех пор об ошибках не сообщалось. Я думаю, что это решило проблему. Спасибо МаФо!   -  person Maxime    schedule 24.12.2013