我试图了解在参数化准备好的语句的情况下,语句缓存是否有用。
根据我的理解
如果使用缓存,则查询将基于其“字符串”进行缓存。
在这种情况下,如果查询具有不同的参数值,则它是不同的/ 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年以来,所有现代数据库都值得一提的是缓存执行计划,无论执行的语句类型如何。
代表PreparedStatement
或CallableStatement
的实际Java对象有一些最小的客户端缓存,但是在现代的JDBC
驱动程序中,任何实际的时间或空间节省都是最小的。
在服务器端计算execution plan
的开销比在客户端进行简单String
操作要大几个数量级。这意味着使用PreparedStatement
在客户端没有任何有意义的性能优势,还有其他更重要的优势,例如SQL Injection
保护可以证明使用一个合理性。