Scala Play 2.2 Slick 1.0.1 - 未来 { Try {...} } 等待空闲的可用连接超时

2024-02-11

我有一个 scala.html 页面,它在 Play 2.2.1、Scala 2.10.2、Slick 1.0.1、Postgres 9.3 应用程序中进行 AJAX 调用。

以下同步代码工作正常。它解析请求查询字符串并调用该方法Schools.findSchoolsByFilter,它对表进行 scala 灵活调用,并根据SchoolFilter对象并返回一个Try[List[School]]

def listSchools = Action { implicit request =>
  db.withSession { implicit s: Session =>
    Schools.findSchoolsByFilter(parseFilter) match {
      case Success(schools) => Ok(toJsArray(schools))
      case Failure(e) => Ok(e.getMessage)
    }
  }
}

如果我将方法更改为异步运行(见下文),并对 listSchools 进行多次调用,则大约 20 秒后会抛出此异常。我怀疑这可能是某种类似于这篇文章的竞争条件发挥光滑和异步 - 这是一个竞争条件吗? https://stackoverflow.com/questions/18579684/play-slick-and-async-is-it-a-race-condition。我的问题是,我应该如何更改此代码以安全地异步运行它?

def listSchools = Action.async { implicit request =>
  db.withSession { implicit s: Session =>
    Schools.findSchoolsByFilter(parseFilter) map {
      case Success(schools) => Ok(toJsArray(schools))
      case Failure(e) => Ok(e.getMessage)
    }
  }
}
def findSchoolsByFilter(f: SchoolFilter, n: Int)(implicit s: Session) = 
  future { Try {
    ...
}}
case class SchoolFilter(name: Option[String], 
                        city: Option[String], 
                        state: Option[String],
                        zip: Option[String], 
                        district: Option[String])

这是我的依赖项:

libraryDependencies ++= Seq(
  jdbc,
  cache,
  "com.typesafe.slick" %% "slick" % "1.0.1",
  "com.github.tototoshi" %% "slick-joda-mapper" % "0.4.0",
  "org.scalatest" % "scalatest_2.10" % "2.0" % "test",
  "org.easymock" % "easymock" % "3.2",
  "org.postgresql" % "postgresql" % "9.3-1100-jdbc4"
)

这是堆栈跟踪:

com.jolbox.bonecp.DefaultConnectionStrategy.getConnectionInternal(DefaultConnectionStrategy.java:88) com.jolbox.bonecp.AbstractConnectionStrategy.getConnection(AbstractConnectionStrategy.java:90) com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:553) com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:131) scala.slick.session.Database$$anon$1.createConnection(Database.scala:82) scala.slick.session.BaseSession.conn$lzycompute(Session.scala:207) scala.slick.session.BaseSession.conn(会话.scala:207) scala.slick.session.Session$class.prepareStatement(Session.scala:29) scala.slick.session.BaseSession.prepareStatement(Session.scala:201) scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:29) scala.slick.jdbc.StatementInvoker.elementsTo(StatementInvoker.scala:17) scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:90) scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10) scala.slick.jdbc.Invoker$class.build(Invoker.scala:66) scala.slick.jdbc.StatementInvoker.build(StatementInvoker.scala:10) scala.slick.jdbc.Invoker$class.list(Invoker.scala:56) scala.slick.jdbc.StatementInvoker.list(StatementInvoker.scala:10) scala.slick.jdbc.UnitInvoker$class.list(Invoker.scala:150) scala.slick.driver.BasicInvokerComponent$QueryInvoker.list(BasicInvokerComponent.scala:19) models.school.Schools$$anonfun$findSchoolsByFilter$1$$anonfun$apply$5.apply(School.scala:85) models.school.Schools$$anonfun$findSchoolsByFilter$1$$anonfun$apply$5.apply(School.scala:84) scala.util.Try$.apply(Try.scala:161) models.school.Schools$$anonfun$findSchoolsByFilter$1.apply(School.scala:84) models.school.Schools$$anonfun$findSchoolsByFilter$1.apply(School.scala:84) scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) akka.dispatch.TaskInitation.run(AbstractDispatcher.scala:42) akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

UPDATE

根据建议Heroku/Play/BoneCp 连接问题 https://stackoverflow.com/questions/15480506/heroku-play-bonecp-connection-issues,我补充说"com.jolbox" % "bonecp" % "0.8.0.RELEASE"我的库依赖项和以下内容application.conf我仍然有同样的行为。

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

您需要在未来打开会话。现在你正在做相反的事情。 Slick 会话在结束后无效withSession堵塞。如果您在块内打开一个 future,即使在withSession区块结束,会话失效。如果将来的代码尝试使用无效会话,您最终会出现不可预测的行为。

或者换句话说,移动db.withSession { implicit s: Session =>呼叫进入future {...} call.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala Play 2.2 Slick 1.0.1 - 未来 { Try {...} } 等待空闲的可用连接超时 的相关文章

随机推荐

  • 在 R 数据框中创建所有可能的列排列

    我有一个看起来像这样的 df code 1 code 2 code 3 code 4 1 82 93 NA NA 2 15 85 93 NA 3 93 89 NA NA 4 81 NA NA NA 我想生成一个新的 df 它包含所有可能的列
  • 在 Go 中创建迭代器最惯用的方法是什么?

    一种选择是使用渠道 通道在某种程度上就像迭代器 您可以使用 range 关键字迭代它们 但是当你发现你无法在不泄漏 goroutine 的情况下跳出这个循环时 使用就会受到限制 在 Go 中创建迭代器模式的惯用方法是什么 Edit 渠道的根
  • 为什么 Grails 中唯一约束字段更新失败

    当我在域类中映射自定义身份属性时 为什么 hibernate 要检查唯一约束 当我更新对象时 尽管发布的字段值与数据库中存储的值相同 但验证失败 即使我没有对表单进行任何更改 确保 dirty false 并且没有属性绑定错误 也会发生这种
  • SqlDependency 与 SqlCacheDependency

    它们之间的主要区别是什么以及何时应该使用它们 我最初的理解是 SqlCacheDependency 使用轮询 但我读到它对于 ASP NET 2 0 也没有 我想知道哪个最适合在 ASP NET Web 服务器下缓存 linq 查询 这将是
  • 在后台接收推送通知

    我知道很多地方都涉及到这一点 但我无法弄清楚 我使用 Urban Airship 来推送通知 一切似乎都很好 除了当我的应用程序在后台时 didReceiveRemoteNotification没有接到电话 它在前台运行 我能够正确处理消息
  • Echo PHP 变量作为输入字段的值[重复]

    这个问题在这里已经有答案了 我有一个带有多个输入标签的简单 HTML 表单 在页面加载时 我向表单提供数据以回显数据库中字段的当前值 然后用户可以修改这些值并再次提交以执行更新
  • 使用 Lodash 或 Underscore 按多列对对象进行分组

    我有以下对象records notes id 1 description hey userId 2 replyToId null postId 2 parentId null id 5 description hey test userId
  • 线程“main”java.net.ConnectException中出现异常:连接被拒绝:连接[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 如何彻底卸载Visual Studio 2010?

    我一直在寻找一个干净的解决方案来完全并最终从我的计算机中删除 Visual Studio 2010 当您安装 Visual Studio 时 它还会在 添加 删除程序 面板中安装一堆程序 大约 55 个 appwiz cpl 我已经尝试过微
  • ABPeoplePickerNavigationController 随着 iOS8 的变化?

    由于我已将 iPhone 上的 XCode 6 0 6A313 和 iOS 8 0 12A365 更新为 gm 种子 因此 ABPeoplePickerNavigationController 代码无法像以前一样工作 iOS 7 1 2 如
  • AWS Step Functions 与 Luigi 的编排对比

    我的团队有一个针对小型项目的整体服务 但为了重新架构和扩展 我们计划迁移到 Amazon AWS 的云服务 并评估编排是否将 Luigi 作为容器任务运行或使用 AWS Step Functions 我对他们中的任何一个都没有任何经验 尤其
  • Qt 在菜单项单击上显示模式对话框(.ui)

    我想制作一个简单的 关于 模式对话框 从 帮助 gt 关于应用程序 菜单调用 我已经使用 QT Creator ui 文件 创建了一个模式对话框窗口 菜单 关于 槽中应包含什么代码 现在我有了这段代码 但它显示了一个新的模式对话框 不是基于
  • 如何检索 ItemsControl 中项目的 DataTemplate(和特定对象)?

    我已经看到了非常相似问题的解决方案 但它并不适用于我的问题 也就是说 这篇文章 http blogs msdn com wpfsdk archive 2007 04 16 how do i programmatically interact
  • geom_scatterpie 重叠中的饼图

    我想找到一种方法来防止 scatterpie 中的饼图相互重叠 我知道我可以进一步减小半径 但不想让它们比现有的更小 Position jitter 根本不起作用 这是一个可重现的示例 library ggplot2 library ggm
  • Userfrosting 辅助函数的最佳实践

    在使用 userfrosting 的项目中拥有自定义代码 函数库 的最佳实践是什么 到目前为止 我修改了现有的 userfrosting 控制器 这使得简洁的代码变得臃肿 我想有一个很好的方法可以将自定义函数保留在一个地方 它不会干扰 Us
  • Spyder IDE 自动缩进

    是否有任何快捷方式可以在编辑器中自动缩进标记行 例如 在 MATLAB 中存在 CTRL I 快捷键 Matlab语法可以匹配开始结束语句if while for等通过寻找end声明 在 Python 中 这些缩进是不明确的 被定义为嵌套缩
  • java正则表达式

    谁能帮我在java正则表达式中做以下事情吗 我需要从给定字符串的第五个位置读取 3 个字符 忽略前后找到的任何内容 例子 testXXXtest 预期结果 XXX 你根本不需要正则表达式 只需使用子字符串 yourString substr
  • 如何使用自定义命名空间创建 SyndicateFeed

    如何生成包含下图中显示的命名空间的 Atom Feed Atom feed 的所有节点都必须以 a 开头 这就是我现在正在做的事情 但它不起作用 SyndicationFeed feed new SyndicationFeed XmlQua
  • 在 Ktor 中发送 application/x-www-form-urlencoded

    我不知道如何发送application x www form urlencoded POST在 Ktor 中请求 我看到一些submitFormKtor 文档中的帮助程序 但他们没有按预期发送请求 我想要的是复制这个卷曲线行为 curl d
  • Scala Play 2.2 Slick 1.0.1 - 未来 { Try {...} } 等待空闲的可用连接超时

    我有一个 scala html 页面 它在 Play 2 2 1 Scala 2 10 2 Slick 1 0 1 Postgres 9 3 应用程序中进行 AJAX 调用 以下同步代码工作正常 它解析请求查询字符串并调用该方法School