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 初始化资源,在应用程序停止时关闭数据库,然后查看问题是否仍然存在。
下面的代码打印“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 初始化资源,在应用程序停止时关闭数据库,然后查看问题是否仍然存在。