Play for Scala 中的连接不可用

Connection not available in Play for Scala

我在 application.conf 中为内存数据库 HSQLDB 进行了以下配置:

db {
   inmemory {
       jndiName = jndiInMemory
       driver = org.hsqldb.jdbc.JDBCDriver
       url = "jdbc:hsqldb:mem:inmemory"
  }
}

并使用以下语句连接控制器

val database = Database.forName("jndiInMemory")
val session = database.createSession
val conn = session.conn
//  JDBC statements

问题是,当代码运行多次时,我在 session.conn 中遇到异常:

HikariPool-34 - Connection is not available, request timed out after 30000ms.

因为我使用的是 JNDI,所以我认为连接被重用了。使用完后是否必须放弃会话?如何修复此代码?

如果不查看实际代码很难判断,但总的来说:当您在应用程序开始时创建数据库连接时,您通常会重复使用它直到应用程序结束 - 然后您应该关闭连接。

如果您每次查询时都生成一个新连接,而没有结束之前的连接,您将很快运行达到连接限制。

易于使用的模式是:在开始时创建一个会话,然后使用依赖注入将其传递到您需要的任何地方运行。

顺便说一句,我注意到对于某些配置,例如Slick 静态创建连接(如:将它们存储为静态 class 属性)。因此,您需要创建一个处理程序,在应用程序退出时关闭会话。它 运行 好的...直到您在 SBT 中多次启动它,默认情况下它使用相同的 JVM 运行 本身和生成的应用程序。在这种情况下,最好将 运行 东西作为叉子。对于测试,我使用 Test / fork := true,对于 运行,我使用 sbt-revolver,尽管我不确定在 Play 中效果如何。