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

根据我的理解


如果使用缓存,则查询将基于其“字符串”进行缓存。
在这种情况下,如果查询具有不同的参数值,则它是不同的/ new语句/字符串。缓存。
同样,当参数更改时,结果也会更改。
由于准备好的语句是参数化的,因此在这种情况下使用缓存真的很有用。


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

此处的语句缓存涉及两种不同的情况:


JAVA:Snaq数据库池提供了ConnectionCache类,该类便于对语句进行缓存。
MySQL:DB还提供了缓存查询和结果的方法。http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


我的困惑很简单:


如果要在缓存中搜索查询/对应结果,我将基于字符串比较来搜索它。
如果参数值更改,则查询字符串也会更改。
对于相同的查询,这将导致在缓存中具有不同的参数值集的不同条目。


希望我澄清我的问题。

最佳答案

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

JDBC查询缓存是在事物的数据库方面完成的,它缓存execution plan,这些参数的值无关紧要,只是每次它们的顺序相同。如果这些值实际上很重要,则缓存任何内容都是没有意义的。

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

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

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

09-10 13:00
查看更多