【发布时间】:2017-05-29 15:56:15
【问题描述】:
我正在尝试加快“SELECT * FROM WHERE name=?”的速度Play 中的各种查询! + 斯卡拉应用程序。我正在使用 Play 2.4 + Scala 2.11 + play-slick-1.1.1 包。此包使用 Slick-3.1 版本。
我的假设是 slick 从 DBIO 操作生成 Prepared 语句并执行它们。所以我尝试缓存他们购买开启标志 cachePrepStmts=true 但是我仍然在日志中看到“Preparing statement...”消息,这意味着 PS 没有被缓存!应该如何指示 slick 缓存它们?
如果我运行以下代码,PS 不应该在某个时候被缓存吗?
for (i <- 1 until 100) {
Await.result(db.run(doctorsTable.filter(_.userName === name).result), 10 seconds)
}
Slick 配置如下:
slick.dbs.default {
driver="slick.driver.MySQLDriver$"
db {
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/staging_db?useSSL=false&cachePrepStmts=true"
user = "user"
password = "passwd"
numThreads = 1 // For not just one thread in HikariCP
properties = {
cachePrepStmts = true
prepStmtCacheSize = 250
prepStmtCacheSqlLimit = 2048
}
}
}
更新 1
我按照@pawel 的使用编译查询的建议尝试了以下操作:
val compiledQuery = Compiled { name: Rep[String] =>
doctorsTable.filter(_.userName === name)
}
val stTime = TimeUtil.getUtcTime
for (i <- 1 until 100) {
FutureUtils.blockFuture(db.compiledQuery(name).result), 10)
}
val endTime = TimeUtil.getUtcTime - stTime
Logger.info(s"Time Taken HERE $endTime")
在我的日志中,我仍然看到如下语句:
2017-01-16 21:34:00,510 DEBUG [db-1] s.j.J.statement [?:?] Preparing statement: select ...
这个时间也是一样的。期望的输出是什么?我应该不再看到这些陈述吗?如何验证 Prepared 语句是否确实被重用。
【问题讨论】:
标签: scala playframework slick hikaricp play-slick