4

阅读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)
      }
    }
  }
}

该函数r在未来某个时间运行,在withSession返回一个 Future[Result] 之后,并调用session.close(). 此代码中是否存在竞争条件?

4

2 回答 2

6

我不确定这是否称为竞争条件。但是对我来说,您似乎是正确的,这里有问题。当未来执行代码时,会话可能不再有效。

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

Async {
  Future {
    DB.withSession{ s:scala.slick.session.Session =>
      r( RequestWithDbSession(request, s) )
    }
  }
}
于 2013-09-02T20:54:58.153 回答
2

我认为你是对的,EECOLOR 建议的修复看起来是正确的。我们在一张票中跟踪这一点:https ://github.com/freekh/play-slick/issues/81

谢谢

于 2013-09-03T10:10:31.803 回答