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