Java 准备好的语句和语句/查询缓存

Java 准备好的语句和语句/查询缓存,java,mysql,jdbc,prepared-statement,query-cache,Java,Mysql,Jdbc,Prepared Statement,Query Cache,我试图理解语句缓存在参数化准备语句的情况下是否有用 据我了解 若我使用缓存,那个么查询将根据其“字符串”进行缓存 在这种情况下,如果查询具有不同的参数值,则它是不同的/新语句/字符串w.r.t.缓存 而且,当参数改变时,结果也会改变 因为准备好的语句是参数化的,所以在这种情况下使用缓存真的有用吗 我正在使用JDBC/Snaq DB Pool/MySQL数据库 这里的语句缓存涉及两种不同的情况: JAVA:Snaq DB池提供了ConnectionCache类,它有助于缓存语句 数据库还提供

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

据我了解

  • 若我使用缓存,那个么查询将根据其“字符串”进行缓存
  • 在这种情况下,如果查询具有不同的参数值,则它是不同的/新语句/字符串w.r.t.缓存
  • 而且,当参数改变时,结果也会改变
  • 因为准备好的语句是参数化的,所以在这种情况下使用缓存真的有用吗
我正在使用JDBC/Snaq DB Pool/MySQL数据库

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

  • JAVA:Snaq DB池提供了ConnectionCache类,它有助于缓存语句
  • 数据库还提供了缓存查询和结果的方法
我的困惑很简单:

  • 如果要在缓存中搜索查询/对应结果,我将根据字符串比较进行搜索
  • 若参数值改变,那个么查询字符串也会改变
  • 这将导致同一查询在缓存中使用不同的参数值集生成不同的条目
希望我澄清我的问题

语句缓存是关于缓存执行计划的
JDBC
查询缓存是在事物的数据库端完成的,它缓存
执行计划
,参数值的大小无关紧要,只是它们每次的顺序相同。如果这些值真的很重要,那么缓存任何东西都没有意义

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

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

在服务器端计算
执行计划
的开销比在客户端进行简单的
字符串
操作要大几个数量级。这意味着使用
PreparedStatement
在客户端没有任何有意义的性能好处,还有其他更重要的好处,如
SQL注入
保护来证明使用一个语句的合理性。

语句缓存是关于缓存执行计划的
JDBC
查询缓存是在事物的数据库端完成的,它缓存
执行计划
,参数值的大小无关紧要,只是它们每次的顺序相同。如果这些值真的很重要,那么缓存任何东西都没有意义

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

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


在服务器端计算
执行计划
的开销比在客户端进行简单的
字符串
操作要大几个数量级。这意味着使用
PreparedStatement
在客户端没有任何有意义的性能好处,还有其他更重要的好处,如
SQL注入
保护来证明使用它的合理性。

您所说的是哪种特定语言和/或数据库?什么是“语句缓存”?更新了我的问题。希望它更清楚。你最好也更新你的标签和标签\为什么要否决投票?怎么了?你说的是哪种语言和/或数据库?什么是“语句缓存”?更新了我的问题。希望它更清楚。你最好也更新你的标签和标签\为什么要否决投票?怎么了?你是在暗示现在使用PreparedStatement没有任何好处。不是暗示,直接说,为了节省时间或空间,
PreparedStatements
现在不会像15年前那样给你带来任何好处。它们还有其他更重要的好处。PreparedStatement可以防止SQL注入攻击,通过JDBC批处理,它们的性能更好,并且增加了重用缓存执行计划的机会。只有Oracle和SQL Server提供强制语句参数化,但这也有缺点。你是在暗示现在使用PreparedStatement没有任何好处。不是在暗示,直接说,为了节省时间或空间,
PreparedStatements
现在不会像15年前那样给你带来任何好处。它们还有其他更重要的好处。PreparedStatement可以防止SQL注入攻击,通过JDBC批处理,它们的性能更好,并且增加了重用缓存执行计划的机会。只有Oracle和SQL Server提供强制语句参数化,但这也有缺点。