光滑的准备好的声明

use*_*214 5 mysql scala slick hikaricp

我正在使用 slick 3.0.0-M1 和 "com.zaxxer" % "HikariCP" % "2.4.3"

Slick 正在为每个查询(由日志记录表明)准备一条语句,这是不好的:

"Preparing statement: select * from ..." 
Run Code Online (Sandbox Code Playgroud)

我的配置告诉 Slick / Hikari 缓存准备好的语句:

myDB {
  url = "jdbc:mysql://...
  user = ...
  ...
  connectionPool = HikariCP
  queueSize = 50000
  maxConnections = 50
  properties.cachePrepStmts = true
  properties.prepStmtCacheSize = 20000
  properties.prepStmtCacheSqlLimit = 100000
}
Run Code Online (Sandbox Code Playgroud)

日志似乎表明这些属性已被读取:

configuration:
...
dataSourceName..................
dataSourceClassName.............
dataSourceProperties............
    {password=<masked>, 
     prepStmtCacheSqlLimit=100000, 
     cachePrepStmts=true, 
     prepStmtCacheSize=20000}
maximumPoolSize.................50
poolName..........................
Run Code Online (Sandbox Code Playgroud)

db 对象被实例化并在测试中使用:

val db = Database.forConfig("", config.getConfig("myDB"))
val qTemplate = StaticQuery[(Int), MyRow] + "select * from table_name where num=?"
db.withSession{ implicit session =>
   (0 until 100).foreach{ case i => 
       qTemplate(2).foreach(println)
   } 
}
Run Code Online (Sandbox Code Playgroud)

对于每次调用 qTemplate(2),slick 都会记录“正在准备语句...”为什么模板不被缓存?

ekr*_*ich 0

首先,如果您需要最新版本,我建议您使用 Slick 的生产版本,例如 3.1.1。http://slick.typesafe.com/

通常情况下,连接池进行连接缓存,数据库进行语句缓存。使用带有占位符的PreparedStatement,例如?应该足以让 MySql 缓存该语句。数据库必须解析该语句,并且每个语句必须看起来相同,以便数据库缓存该语句。此功能避免了让数据库使用不同的参数值一遍又一遍地解析相同的语句。

如果您查看有关语句缓存的文档也将有助于解释 - https://github.com/brettwooldridge/HikariCP - 这里还有一些有关 MySQL 的更多信息 - https://github.com/brettwooldridge/HikariCP/wiki /MySQL-配置

我只会升级 Slick 并继续做你正在做的事情。

埃里克