准备好的语句和语句/查询缓存

Lea*_*ore 2 java mysql jdbc prepared-statement query-cache

我试图了解语句缓存在参数化准备语句的情况下是否有用。

据我的理解

  • 如果我使用缓存,那么查询将根据其“字符串”进行缓存。
  • 在这种情况下,如果查询具有不同的参数值,那么它是一个不同的/新的语句/字符串 wrt 缓存。
  • 此外,当参数改变时,结果也会改变。
  • 由于准备好的语句是参数化的,因此在这种情况下使用缓存真的有用吗?

我正在使用 JDBC/Snaq DB Pool/ MySQL 数据库。

这里的Statement Caching指的是两种不同的情况:

我的困惑很简单:

  • 如果我要在缓存中搜索查询/相应结果,我将根据字符串比较来搜索它。
  • 如果参数值发生变化,查询字符串也会发生变化。
  • 这将导致具有不同参数值集的同一查询在缓存中产生不同的条目。

希望我能澄清我的问题。

小智 5

语句缓存就是缓存执行计划

JDBC查询缓存是在数据库端完成的,它缓存execution plan参数的值是什么并不重要,只是它们每次的顺序都相同。如果这些值确实很重要,那么缓存任何东西就没有意义了。

很久以前,您必须使用PreparedStatements缓存来获取执行计划,但从 2005 年到 2008 年左右,所有值得一提的现代数据库都缓存执行计划,无论执行的语句类型如何。

存在一些代表PreparedStatement或 的实际 Java 对象的最小客户端缓存CallableStatement,但在现代驱动程序中,时间或空间上的任何实际节省都将是最小的JDBC

在服务器端计算的开销比在客户端execution plan进行简单操作的开销大几个数量级。这意味着使用 a 在客户端String没有任何有意义的PreparedStatement性能优势,还有其他更重要的优势,例如SQL Injection保护来证明使用 a 的合理性。

  • PreparedStatement 可防止 SQL 注入攻击,它们通过 JDBC 批处理执行得更好,并增加了重用缓存执行计划的机会。只有 Oracle 和 SQL Server 提供强制语句参数化,但这也有缺点。 (2认同)