我想知道如何在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。
答案 0 :(得分:1)
每次查询后都不要创建和销毁池。那将是一场灾难。 HikariCP是线程安全的。虽然我建议,如果可能的话,运行最新的(2.3.6)。
答案 1 :(得分:1)
我仍然有几个关于最佳做法的问题,但我认为如果你改变了
private def db: Database = Database.forConfig("mydb")
到
private val db: Database = Database.forConfig("mydb")
请注意从def
到val
的更改。
这应该消除为每个查询创建新连接池。