玩光滑和异步 - 这是竞争条件吗?

the*_*met 4 scala playframework play-slick

阅读Play-Slick DBAction代码,我认为此代码可能包含竞争条件:

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)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

该函数r在将来withSession返回Future [Result]并调用之后运行session.close().这段代码中是否存在竞争条件?

EEC*_*LOR 6

我不确定这是否称为竞争条件.但对我来说,似乎你说错了,这里有些不对劲.将来执行代码时,会话可能不再有效.

反转执行并从未来请求数据库会话会更好:

Async {
  Future {
    DB.withSession{ s:scala.slick.session.Session =>
      r( RequestWithDbSession(request, s) )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)