セッションとリクエストの両方を取る関数を使用する play の Action の周りに次のラッパーを書きました。最初のバージョンは次のとおりです。
def ActionWithSession[A](bp: BodyParser[A])(f: Session => Request[A] => Result): Action[A] =
Action(bp) {
db.withSession {
session: DbSession =>
request => f(session)(request)
}
}
このバージョンはうまく機能します (正しい Result がブラウザに返されます) が、呼び出しごとにデータベース接続がリークします。何度か電話した後、次の例外が発生し始めました。
java.sql.SQLException: Timed out waiting for a free available connection.
以下のバージョンに変更すると(request =>
アクションの直後に移動することで、接続漏れがなくなり、動作します。
def ActionWithSession[A](bp: BodyParser[A])(f: Session => Request[A] => Result): Action[A] =
Action(bp) { request =>
db.withSession {
session: DbSession =>
f(session)(request)
}
}
最初のバージョンで接続がリークするのはなぜですか? また、2 番目のバージョンではそれがどのように修正されるのでしょうか?