Scala 打滑和异步-这是比赛条件吗?
阅读时,我认为此代码可能包含一个竞争条件:Scala 打滑和异步-这是比赛条件吗?,scala,playframework,play-slick,Scala,Playframework,Play Slick,阅读时,我认为此代码可能包含一个竞争条件: object DBAction{ // snip def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = { Action { implicit request => AsyncResult { DB.withSession{ s:scala.slick.session.Session =>
object DBAction{
// snip
def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = {
Action { implicit request =>
AsyncResult {
DB.withSession{ s:scala.slick.session.Session =>
Future(r( RequestWithDbSession(request,s) ))(executionContext)
}
}
}
}
函数
r
在withSession
返回未来的[Result]并调用session.close()
后在将来运行。此代码中是否存在竞争条件?我不确定这是否称为竞争条件。然而,在我看来,你是对的,这里出了点问题。当future执行代码时,会话可能不再有效
最好在将来反转执行并请求数据库会话:
Async {
Future {
DB.withSession{ s:scala.slick.session.Session =>
r( RequestWithDbSession(request, s) )
}
}
}
我认为您的建议是正确的,EECOLOR建议的修复看起来是正确的。我们正在一张记录单中跟踪这一点: Thx