当前位置: 首页 > 知识库问答 >
问题:

Scala Play 2.2 Slick 1.0.1-未来{尝试{…}}等待免费可用连接超时

柳轶
2023-03-14

我有一个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秒后就会抛出这个异常。我怀疑这可能是某种类似于后播放slick和Async的竞态条件——这是竞态条件吗?。我的问题是,我应该如何更改这段代码安全地异步运行它?

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 . jol box . bone CP . defaultconnectionstrategy . get connection internal(defaultconnectionstrategy . Java:88)com . jol box . bone CP . abstractconnectionstrategy . get connection(abstractconnectionstrategy . Java:90)com . jol box . bone CP . bone CP . get connection(bone CP . Java:553)com . jol box . bone CP . bonecp data source . get connection(bone CP data source . Java:131)Scala . slick . session . database $ $ anon $ 1 . create connection(database . Scala:82)apply(try . Scala:161)models . school . schools $ $ anon fun $ findSchoolsByFilter $ 1 . apply(school . Scala:84)models . schools $ $ anon fun $ findSchoolsByFilter $ 1 . apply(school . Scala:84)Scala . concurrent . impl . future $ promisecompletingrunnable . lifted tree 1 $ 1(future . Scala:24)Scala . concurrent . impl . future $ promisecompletingrunnable . run(future . Scala:24

根据Heroku/Play/BoneCp连接问题的建议,我将“com.jolbox”%“BoneCp”%”0.8.0.RELEASE“添加到我的库依赖项中,并将以下内容添加到application中。conf</code>,我仍然得到相同的行为。

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

共有1个答案

宿衡虑
2023-03-14

您需要在将来打开会话。现在你正在做相反的事情。光滑会话在 withSession 块结束后无效。如果您在块中打开未来,即使在 withSession 块结束并且会话无效之后,它也会挂起会话。如果将来的代码尝试使用无效会话,则最终会出现不可预测的行为。

或者换句话说,移动< code > db . with Session { implicit s:Session =

 类似资料:
  • 我想运行相同类型的任务(工作线程),但一次不超过一定数量的任务。当任务完成时,其结果是新任务的输入,然后可以启动该任务。 有没有好的方法可以在C 11中使用异步/未来范式来实现这一点? 乍一看,它看起来很简单,你只是生成多个任务: 然后,运行以获取任务的异步结果。 然而,这里的问题是,未来的对象必须存储在某种队列中并一个接一个地等待。但是,可以一遍又一遍地迭代未来的对象,检查它们中的任何一个是否准

  • 问题内容: 我正在运行以下MySQL语句: 我没有使用交易,所以为什么会出现此错误?我什至尝试重新启动MySQL服务器,但没有帮助。 该表有406,733行。 问题答案: 您正在使用交易;autocommit不会禁用事务,它只是使它们在语句末尾自动提交。 发生的事情是,某个其他线程在某个记录上保持记录锁定(您正在更新表中的每个记录!)的时间太长,导致您的线程超时。 您可以通过发出 事件发生后(在编

  • 我们使用PgBouncer作为基于spring的应用程序连接池的中间件。在应用程序中,我们使用HikariCP进行应用程序级连接池。 我们将HikariCP的值设置为一小时,将设置为30秒。

  • 我有一个方法,可以返回期货的 现在我想等待,直到所有的future都成功完成处理,或者future返回其输出的任何任务抛出异常。即使一项任务引发异常,等待另一项任务也没有意义。 简单的方法是 但这里的问题是,例如,如果第四个期货抛出异常,那么我将不必要地等待前三个期货可用。 如何解决这个问题?会以任何方式倒数闩锁帮助吗?我无法使用Future,因为java文档说

  • 问题内容: 更新记录时,我反复出现锁定超时超出异常的情况。 我正在使用Java Struts 2.1 Hibernate配置。使用的数据库是MYSQL。 任何人都知道如何解决它。 问题答案: 这里有一些建议: “ 锁定等待超时 ”通常发生在事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。 在大多数情况下,问题出在数据库方面。可能的原因可能是表格设计不当,数据量大,约束等。 请查看这个详

  • 是否有一种方法可以尝试等待一段时间,然后返回不同的结果,而不取消超时后的未来? 我有一个服务(我们称之为),它跑出去做自己的事情。它返回一个结果: 我愿意[阻止并]等待它一小段时间(比方说2秒)。如果它没有完成,我希望返回一个不同的结果,但我希望服务继续做它自己的事情。然后查询服务是否完成(例如,通过websockets或其他方式)将是客户端的工作。 即。我们有以下几个案例: 花费%1 s并完成其