【问题标题】:when to use Statement over Prepared Statement?何时使用语句而不是准备语句?
【发布时间】:2011-09-14 16:23:51
【问题描述】:

何时使用语句而不是准备好的语句。我想语句用于没有参数的查询,但为什么不使用准备好的语句?对于没有参数的查询,哪一个更快。

【问题讨论】:

标签: java database jdbc


【解决方案1】:

我认为语句用于没有参数的查询,但为什么不使用准备好的语句?

这还不算接近。 PreparedStatements 用于返回 ResultSet 或更新计数的 INSERT、UPDATE 和 DELETE 语句。正如 Joachim 所指出的,它们不适用于 DDL 语句,也不适用于调用应该使用 CallableStatement 的存储过程(这不是两个类之间的区别)。就没有绑定参数的查询而言,PreparedStatements 可能比 Statements 更好(见下文)。

对于没有参数的查询,哪个更快。

从长远来看,PreparedStatements 会变得更快,超过在单个连接中的扩展使用。这是因为,虽然 PreparedStatements 必须被编译,这需要一些时间(这确实不多,所以不要认为这是一个缺点),编译后的版本本质上包含对 SQL 执行计划的引用数据库。编译后,PreparedStatement 将存储在特定于连接的缓存中,以便可以重用编译后的版本以实现性能提升。如果您使用 JDBC Batch 操作,则使用 PreparedStatements 将使批处理的执行速度比使用普通 Statement 对象快得多,后者可能需要一次又一次地准备计划,如果数据库必须这样做的话。

【讨论】:

  • 仅供参考,大部分典型查询的工作是解析语句,而不是数据检索。如果多次使用同一个语句,PreparedStatements 会快很多。
  • 是的,也就是说,当您在一次执行、executeUpdate 或 executeQuery 调用中比较解析和执行时。如果您有足够大的语句缓存,则预编译语句本质上是在多次调用中为您提供性能提升的原因。
【解决方案2】:

这取决于您的要求。

如果您的 SQL 语句在循环中运行或经常使用不同的参数,那么 PreparedStatement 是最佳选择,因为它正在预编译并缓存此参数化 SQL 查询的执行计划。每次从同一个 PreparedStatement 对象运行时,它都会使用缓存的执行计划并提供更好的性能。

使用 PreparedStatement 也可以避免 SQL 注入。

但是如果你确定你只运行一次 SQL 查询,有时 Statement 将是最好的选择,因为当你创建 PreparedStatement 对象时,它有时会进行额外的 db 调用,如果驱动程序支持预编译,方法 Connection.prepareStatement(java.lang.String) 将发送声明到数据库进行预编译。

阅读以下文章以了解“Statement 与 PreparedStatement”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多