"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를 캐싱하지 않는다는 것을 의미하는 "Preparing statement ..."메시지를 로그에 표시한다! 어떻게하면 캐시를 매끄럽게 지시해야합니까?
다음 코드를 실행하면 PS가 캐시되지 않아야합니까? 내가 사용 컴파일 된 쿼리 @의 파블의 제안에 따라 다음과 같은 시도
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
: 다음과 같이
for (i <- 1 until 100) {
Await.result(db.run(doctorsTable.filter(_.userName === name).result), 10 seconds)
}
슬릭 설정이다에서
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 콤보에서 전혀 작동하지 않는지에 대해 나는 궁금하다. JDBC에서 preparestatement가 캐쉬되어 있는지 아닌지 어떻게 확인할 수 있습니까? 서버 측 명령문 캐싱을 사용하는 – Richeek
mysql 쿼리 로그는 초기 쿼리에 대해 하나의 prepare + execute를 표시하고 그 다음에 대상 명령문에 대한 모든 후속 캐시 히트에 대해서만 실행합니다. 'useServerPrepStmts = true'를 추가하면 로그에이 패턴이 표시됩니다. – virtualeyes
나는 그것을 시험해 보았다. 실제로 당신은 어떻게 MySQL 쿼리 로깅을 켤 수 있는지 알고 있습니까? 나는 매끄러운 로깅을 켜 놓았고 항상 Prepear statement : select ...를 보여 주었다. 이 문장은 JdbcBackend.scala에서 가져온 것입니다 : https://github.com/slick/slick/blob/074002eb6290c0742ab28135c8109b3465311b81/slick/src/main/scala/slick/jdbc/JdbcBackend.scala#L301 그래서 혼동이 생깁니다 – Richeek