【问题标题】:SQLException: Timed out waiting for a free available connectionSQLException:等待空闲可用连接超时
【发布时间】:2013-04-29 09:19:31
【问题描述】:

我正在用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 中重新启动应用程序。

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

【问题讨论】:

    标签: heroku playframework


    【解决方案1】:

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

    Heroku 在 30 秒后关闭连接。

    【讨论】:

    • 使用 boneCP 0.8.0.rc2 和指定的 boneCP 配置参数,从昨天开始就没有出现问题
    【解决方案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
    

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

    【讨论】:

    • 升级到boneCP 0.8.0-rc2问题依旧
    • 我正在将我的数据库更改为 postgresql,并且这些错误似乎消失了。虽然我还在为 postgresql 数据库苦苦挣扎。
    【解决方案3】:

    我遇到了同样的问题。当您的 Play 应用程序上存在巨大的 reuqest 线程并且 play 无法维护 DB 池时,就会发生此问题。为了让 Play 能够轻松地维护 DB 池,您需要添加以下三点你的appliaction.conf 文件

    • db.default.maxConnectionsPerPartition=100 // 这说明了什么 Max 连接您的 Play Framework 需要维护
    • db.default.minConnectionsPerPartition=10 //启动期间最小如何 它应该有许多数据库连接
    • db.default.acquireIncrement=10 // 一旦 Db 连接超过 maxConnectionsPerPartition 那么它需要分配多少 游泳池

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2011-11-08
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多