我围绕 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)
}
}
这个版本运行良好(正确的结果返回给浏览器),但是每次调用都会泄漏一个数据库连接。几次通话后,我开始收到以下异常:
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)
}
}
为什么第一个版本会导致连接泄漏,以及第二个版本如何解决这个问题?