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 中效果如何。
我在 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 中效果如何。