准备好的声明和声明/查询缓存

时间:2013-08-01 07:28:43

标签: java mysql jdbc prepared-statement query-cache

我正在尝试理解语句缓存在参数化预准备语句的情况下是否有用。

根据我的理解

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

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

语句缓存在这里涉及两种不同的情况:

我的困惑很简单:

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

希望我澄清一下我的问题。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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