Play for Scala 中不会调用 Slick Transactionally future

Slick Transactionally future is not invoked in Play for Scala

下面的代码打印“1”而从不打印“2”,因此浏览器在请求由 index 方法提供的页面时挂起。永远不会调用未来。如果将 future.map 语句替换为 Await.result(future, Duration.Inf),则代码可以正常工作。有什么问题?

case class UserRole (sk: Int, name: String)

class UserRoleDB(tag: Tag) extends Table[UserRole](tag, "user_roles") {
  def sk = column[Int]("sk", O.PrimaryKey)
  def name = column[String]("name")
  def * = (sk, name) <>  ((UserRole.apply _).tupled, UserRole.unapply)
}

class Test extends Controller  {

  def index = Action.async { request =>

    val db = Database.forConfig("db1")
    val userRoles = TableQuery[UserRoleDB]
    val ur = UserRole(1002,"aaa")

    try {

          val action = (for {
                  userRole2 <- userRoles += ur
              } yield (userRole2)).transactionally

          val future = db.run(action)
          println(1)
//        val result = Await.result(future, Duration.Inf)
          future.map { result => {
             println(2)
             Ok("Finished OK")
           }
          }
      } 
      finally db.close

  }
}

首先,您不应该在每个 http 请求上都创建数据库连接。 其次,您的 finally 子句可能在您的 future 有机会被执行之前执行,这可能是您出现问题的原因。

除此之外,它看起来不错。尝试在应用程序启动时或通过 DI 初始化资源,在应用程序停止时关闭数据库,然后查看问题是否仍然存在。