0

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

据我了解

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

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

这里的语句缓存指的是两种不同的情况:

我的困惑很简单:

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

希望我澄清我的问题。

4

1 回答 1

4

语句缓存是关于缓存执行计划

JDBC查询缓存是在数据库端完成的,它缓存execution plan参数的值是什么无关紧要,只是它们每次都以相同的顺序排列。如果这些值真的很重要,那么缓存任何东西都是没有意义的。

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

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

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

于 2013-08-01T16:32:45.050 回答