阅读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()
将在未来时间运行。这段代码中是否存在竞争条件?
答案 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