7

我正在用 java 构建一个应用程序Play Framework 2.0.4。该应用程序部署在herokucleardb 数据库中。

用户不断收到此偶发错误:

PlayException: Execution exception [[PersistenceException: java.sql.SQLException: Timed out waiting for a free available connection.]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134)
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115)
    at akka.actor.Actor$class.apply(Actor.scala:318)
    at play.core.ActionInvoker.apply(Invoker.scala:113)
    at akka.actor.ActorCell.invoke(ActorCell.scala:626)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
    at akka.dispatch.Mailbox.run(Mailbox.scala:179)
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516)
    at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
    at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
    at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
    at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
Caused by: javax.persistence.PersistenceException: java.sql.SQLException: Timed out waiting for a free available connection.
    at com.avaje.ebeaninternal.server.transaction.TransactionManager.createQueryTransaction(TransactionManager.java:356)
    at com.avaje.ebeaninternal.server.core.DefaultServer.createQueryTransaction(DefaultServer.java:2021)
    at com.avaje.ebeaninternal.server.core.OrmQueryRequest.initTransIfRequired(OrmQueryRequest.java:241)
    at com.avaje.ebeaninternal.server.core.DefaultServer.findId(DefaultServer.java:1212)
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:1118)
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:1105)
    at play.db.ebean.Model$Finder.byId(Model.java:237)

现在变得更糟,有时所有用户每次都会遇到相同的错误,直到我在 heroku 中重新启动应用程序。

调试它的任何帮助或提示?

4

4 回答 4

5

我认为问题与Heroku/Play/BoneCp 连接问题相同

Heroku 在 30 秒后关闭连接。

于 2013-05-14T15:18:42.993 回答
2

添加 boneCp 0.8.0.rc1 后,在 Build.scala 和

db.default.idleMaxAge=10 minutes
db.default.idleConnectionTestPeriod=30 seconds
db.default.connectionTimeout=20 second
db.default.connectionTestStatement="SELECT 1"
db.default.maxConnectionAge=30 minutes

但我仍然遇到超时错误,特别是当我打开页面然后点击刷新时。

于 2013-05-16T15:05:16.523 回答
2

我遇到了同样的问题。当您的 Play 应用程序上有巨大的 reuqest 线程并且 play 无法维护 DB 池时,就会发生此问题。为了使 Play 能够舒适地维护 DB 池,您需要在应用程序中添加以下三点。配置文件

  • db.default.maxConnectionsPerPartition=100 // 这说明您的 Play Framework 需要维护的最大连接数
  • db.default.minConnectionsPerPartition=10 //在启动期间它应该有多少数据库连接
  • db.default.acquireIncrement=10 // 一旦 Db 连接超过 maxConnectionsPerPartition 那么它需要在池中分配多少
于 2015-02-08T15:27:42.857 回答
0

您好,也有这个问题,请问您解决了吗?我在网上搜索,关于这个。他们都说您没有关闭与数据库的连接。但我根本不打开它们,我的意思是为我做这个。他们还发现关闭代码仅适用于 scala..

我找到的最后一个“解决方案”在配置文件中,但它不能 100% 工作。 http://www.playframework.com/documentation/2.0/SettingsJDBC

于 2013-05-14T14:26:20.070 回答