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