【问题标题】:Slick Prepared Statement精心准备的声明
【发布时间】:2016-03-29 06:21:29
【问题描述】:

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

Slick 正在为每个错误的查询(由日志记录指示)准备一个语句:

"Preparing statement: select * from ..." 

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

myDB {
  url = "jdbc:mysql://...
  user = ...
  ...
  connectionPool = HikariCP
  queueSize = 50000
  maxConnections = 50
  properties.cachePrepStmts = true
  properties.prepStmtCacheSize = 20000
  properties.prepStmtCacheSqlLimit = 100000
}

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

configuration:
...
dataSourceName..................
dataSourceClassName.............
dataSourceProperties............
    {password=<masked>, 
     prepStmtCacheSqlLimit=100000, 
     cachePrepStmts=true, 
     prepStmtCacheSize=20000}
maximumPoolSize.................50
poolName..........................

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)
   } 
}

对于 qTemplate(2) 的每次调用,slick 都会记录 'Preparing Statement...' 为什么模板没有被缓存?

【问题讨论】:

    标签: mysql scala slick hikaricp


    【解决方案1】:

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

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

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

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

    埃里克

    【讨论】:

    • 文档说 Slick 尽可能使用准备好的语句,但它不会自行缓存它们。因此,您应该在连接池的配置中启用准备好的语句缓存。
    • 我明白你在这里指的是什么 - slick.typesafe.com/doc/3.1.1/database.html - Slick 团队的某个人可能需要澄清一下。如果您不使用直接 SQL,则 Slick 会生成 SQL,因此他们可能指的是 Slick 生成的 SQL。我理解它的方式是 SQL 和参数通过驱动程序传递给数据库。然后数据库可以查找已经解析的语句,并使用参数数据执行语句而不解析语句。
    • 我进行了更多调查,似乎那些参数化语句正在工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多