私は高速化しようとしています "SELECT * FROM WHERE name =?" Playでのクエリの種類+スカラアプリ。私はPlay 2.4 + Scala 2.11 + play-slick-1.1.1パッケージを使用しています。このパッケージはSlick-3.1バージョンを使用しています。キャッシュスリックDBIOアクション
私の仮説は、slickがDBIOアクションからPrepared文を生成し、実行されるという仮説でした。だから私はそれらをキャッシュしようとしましたcachePrepStmts = true しかし、私はまだ準備中の文を見る...というメッセージがログに記録されているので、PSはキャッシュされません。誰かがそれらをキャッシュするにはどのように滑らかに指示すべきですか?
次のコードを実行すると、PSがある時点でキャッシュされるべきではありませんか?
for (i <- 1 until 100) {
Await.result(db.run(doctorsTable.filter(_.userName === name).result), 10 seconds)
}
次のようにスリック設定は次のとおりです。
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
私がコンパイルされたクエリを使用しての@のパヴェルの提案に従って、次の試してみました。私の中
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ステートメントが実際に再利用されたかどうかを確認する方法を教えてください。
お返事ありがとうございます。現時点では、準備されたステートメントキャッシングがSlick + Hikariのコンボではまったく動作しているかどうかに関しては全く興味がありません。私はpreparedstatementがキャッシュされているかどうかをどのように検証することができますか?サーバサイドの文キャッシュを有効にした – Richeek
mysqlクエリログでは、最初のクエリに対して1回のprepare + executeが表示され、その後にターゲット文のそれ以降のすべてのキャッシュヒットに対してのみ実行されます。 'useServerPrepStmts = true'を追加すると、このパターンがログに表示されます。 – virtualeyes
私はそれを試みました。実際にあなたはどのように私はMySQLのクエリのログを有効にすることができます知っていますか?私は滑らかなロギングをオンにし、常に準備中の文:選択...のような種類のログを表示します。このステートメントはJdbcBackend.scalaから来ています:https://github.com/slick/slick/blob/074002eb6290c0742ab28135c8109b3465311b81/slick/src/main/scala/slick/jdbc/JdbcBackend.scala#L301それで混乱が生まれます – Richeek