【问题标题】:How to manage Slick 3.0.0 Database instances in Play Framework如何在 Play Framework 中管理 Slick 3.0.0 数据库实例
【发布时间】:2015-04-08 20:09:29
【问题描述】:

我想知道如何在 Play Framework 2.3.x 应用程序中管理 Slick 3(目前为 3.0.0-RC3)数据库实例的正确方法。根据升级指南,each instance has a connection pool associated

我的猜测是我应该在整个应用程序中处理每个真实数据库的单个实例,而不是为每个数据库操作创建一个实例 (like this example),因为后者意味着还要为每个操作创建一个池。如果我关注the example 并这样做:

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。

【问题讨论】:

    标签: playframework-2.3 hikaricp slick-3.0


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      注意从 defval 的变化。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        相关资源
        最近更新 更多