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

この関数は、 が Future[Result] を返し、 を呼び出したr後、将来の時点で実行されます。このコードに競合状態はありますか?withSessionsession.close()

4

2 に答える 2

6

それが競合状態と呼ばれるかどうかはわかりません。しかし、私には、ここで何かが間違っていることは正しいようです。Future がコードを実行すると、セッションが無効になる可能性があります。

実行を逆にして、将来からデータベース セッションを要求することをお勧めします。

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 に答える