SQLException:等待免费可用连接超时

时间:2013-04-29 09:19:32

标签: heroku playframework

我正在使用Play Framework 2.0.4在java中构建应用。该应用程序部署在heroku中,带有cleardb数据库。

用户不断收到此错误:

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 个答案:

答案 0 :(得分:5)

我认为问题与Heroku/Play/BoneCp connection issues

相同

Heroku在30秒后关闭连接。

答案 1 :(得分:2)

在Build.scala和

上添加boneCp 0.8.0.rc1之后
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

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

答案 2 :(得分:2)

我遇到了同样的问题。当你的Play应用程序中有一个巨大的reuqest线程并且游戏无法维护数据库池时,就会出现这个问题。为了让Play游戏保持舒适,你需要添加以下三个指向你的aplliaction.conf文件

  • db.default.maxConnectionsPerPartition = 100 //这说什么Max 连接你的Play框架需要维护
  • db.default.minConnectionsPerPartition = 10 //启动期间最小化方式 应该有很多数据库连接
  • db.default.acquireIncrement = 10 //一旦Db连接超过 maxConnectionsPerPartition然后需要多少分配 池

答案 3 :(得分:0)

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

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