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

时间:2013-09-02 19:28:37

标签: scala playframework play-slick

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

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返回Future [Result]并调用withSession之后,函数session.close()将在未来时间运行。这段代码中是否存在竞争条件?

2 个答案:

答案 0 :(得分:6)

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

最好反转执行并在将来请求数据库会话:

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

答案 1 :(得分:2)

我认为你是正确的,并且EECOLOR建议的修正看起来是正确的。我们在机票中跟踪此内容:https://github.com/freekh/play-slick/issues/81

THX