【问题标题】:Connection not available in Play for ScalaPlay for Scala 中的连接不可用
【发布时间】:2018-08-03 11:22:02
【问题描述】:

我在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 - 连接不可用,请求超时 30000 毫秒。

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

【问题讨论】:

    标签: scala playframework playframework-2.0 playframework-2.5


    【解决方案1】:

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

    如果您在每次查询时都生成一个新连接,而不结束以前的连接,您将很快在连接限制处运行。

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

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

    【讨论】:

    • 注入连接解决了这个问题。谢谢。
    猜你喜欢
    • 2018-05-12
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多