Как управлять экземплярами базы данных Slick 3.0.0 в Play Framework

Мне было интересно, как правильно управлять экземплярами базы данных Slick 3 (3.0.0-RC3 на данный момент) в приложении Play Framework 2.3.x. Согласно руководству по обновлению, с каждым экземпляром связан пул соединений .

Я предполагаю, что мне следует обрабатывать один экземпляр каждой реальной базы данных во всем приложении, а не создавать экземпляр для каждой операции с базой данных (как в этом примере), потому что последний также подразумевает создание пула для каждой операции. Если я следую примеру и сделать это:

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
  }
}

В итоге я создаю пул, который создает 10 подключений к базе данных за одно выполнение функции getAll и удаляет их после одного запроса.

Однако, если я управляю экземпляром как синглтоном, я не уверен, является ли он потокобезопасным и может ли он безопасно использоваться многими потоками, которыми управляет приложение 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.


person Guillermo Gutiérrez    schedule 08.04.2015    source источник


Ответы (2)


Не создавайте и не уничтожайте пулы после каждого запроса. Это будет катастрофа. HikariCP является потокобезопасным. Хотя я бы предложил, если это возможно, запустить последнюю версию (2.3.6).

person brettw    schedule 09.04.2015

У меня все еще есть несколько вопросов о лучших практиках, но я думаю, что если вы измените

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

to

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

Обратите внимание на изменение с def на val.

Это должно исключить создание нового пула соединений для каждого запроса.

person AlphaGeek    schedule 01.06.2015