我正在尝试理解语句缓存在参数化预准备语句的情况下是否有用。
根据我的理解
我正在使用JDBC / Snaq DB Pool / MySQL数据库。
语句缓存在这里涉及两种不同的情况:
我的困惑很简单:
希望我澄清一下我的问题。
答案 0 :(得分:3)
JDBC
查询缓存是在数据库方面完成的,它缓存execution plan
,参数的值是无关紧要的,只是它们每次都以相同的顺序。如果这些值确实很重要,那么缓存任何东西都没有意义。
很久以前你必须使用PreparedStatements
来缓存执行计划,但是从2005年到2008年,所有现代数据库都值得提及缓存执行计划,而不管执行的语句类型如何。
实际Java对象的一些最小客户端缓存代表PreparedStatement
或CallableStatement
,但在现代JDBC
驱动程序中,任何实际的时间或空间节省都是最小的。
计算服务器端execution plan
的开销比客户端的简单String
操作大几个数量级。这意味着在使用PreparedStatement
的客户端没有有意义的性能优势,还有其他更重要的好处,例如SQL Injection
保护,以证明使用它是合理的。