如何在Play Framework中管理Slick 3.0.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。

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

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

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

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

请注意从def更改为val

这样就不需要为每个查询创建新的连接池。

最新更新