Я пытаюсь ускорить «SELECT * FROM WHERE name =?» вид запросов в Play! + Приложение Scala. Я использую Play 2.4 + Scala 2.11 + play-slick-1.1.1. Этот пакет использует версию Slick-3.1.Cache Slick Действия DBIO
Моя гипотеза заключалась в том, что пятно генерирует подготовленные утверждения из действий DBIO, и они выполняются. Поэтому я попытался их кэшировать, покупая включение флага cachePrepStmts = true Однако я все еще вижу сообщения «Подготовка заявления ...» в журнале, что означает, что 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
}
}
}
Update 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")
В моей logs Я все еще вижу оператор вроде:
2017-01-16 21:34:00,510 DEBUG [db-1] s.j.J.statement [?:?] Preparing statement: select ...
Также сроки этого также остаются неизменными. Каков желаемый результат? Должен ли я больше не видеть эти заявления? Как я могу проверить, действительно ли подготовленные заявления действительно используются повторно.
Спасибо за ваш ответ. На данный момент мне очень любопытно, работает ли кэширование в целом или нет в компиляции Slick + Hikari. Я просто задаюсь вопросом в JDBC, как я могу проверить, кэшировано ли готовое состояние или нет? – Richeek
с кешированием на стороне сервера, включенным в журнал запросов mysql, будет показан один готовый + выполнить для первоначального запроса, а затем выполняется только для всех последующих попыток кэша для целевого оператора. Если вы добавите 'useServerPrepStmts = true', вы должны увидеть этот шаблон в журнале. – virtualeyes
Я пробовал это. На самом деле вы знаете, как включить ведение журнала запросов mysql? Я включил slick logging и всегда показывает, что «Подготовка оператора: select ...» - это тип журналов, независимо от того, что. Это утверждение происходит от JdbcBackend.scala: https://github.com/slick/slick/blob/074002eb6290c0742ab28135c8109b3465311b81/slick/src/main/scala/slick/jdbc/JdbcBackend.scala#L301, что создает путаницу – Richeek