0

我想知道如何在 Play Framework 2.3.x 应用程序中管理 Slick 3(此时为 3.0.0-RC3)数据库实例的正确方法。根据升级指南,每个实例都有一个关联的连接池

我的猜测是我应该在整个应用程序中处理每个真实数据库的单个实例,而不是为每个数据库操作创建一个实例(如本例),因为后者意味着还要为每个操作创建一个池。如果我按照示例执行此操作:

object Thing {
  private def db: Database = Database.forConfig("mydb")

  private val things = TableQuery[Thing]

  def getAll = {
    val curDb = db
    try curDb.run(things.result)
    finally curDb.close
  }
}

我最终创建了一个池,该池在每次执行该getAll函数时创建 10 个与数据库的连接,并在一次查询后处理它们。

但是,如果我将实例作为单例进行管理,我不确定它是否是线程安全的,并且可以被 Play 应用程序管理的许多线程安全地使用。

这是我在 application.conf 中的数据库配置:

mydb= {
  dataSourceClass = org.postgresql.ds.PGSimpleDataSource
  connectionTestQuery="SELECT 1"
  properties = {
    databaseName = "mydb"
    user = "postgres"
    password = "postgres"
    serverName = "localhost"
  }
  numThreads = 10
  connectionPool = HikariCP
}

我正在使用 HikariCP-java6 v2.0.1。

4

2 回答 2

1

不要在每次查询后创建和销毁池。那将是一场灾难。HikariCP 是线程安全的。虽然我建议,如果可能的话,运行最新的(2.3.6)。

于 2015-04-09T05:51:12.853 回答
1

我仍然有几个关于最佳实践是什么的问题,但我认为如果你改变

private def db: Database = Database.forConfig("mydb")

private val db: Database = Database.forConfig("mydb")

注意从def到的变化val

这应该消除为每个查询创建一个新的连接池。

于 2015-06-01T20:28:04.007 回答