PreparedStatements 和性能

新手上路,请多包涵

所以我一直听说 PreparedStatements 对性能有好处。

我们有一个 Java 应用程序,在该应用程序中,我们使用常规“Statement”的次数多于使用“PreparedStatement”的次数。在尝试使用更多 PreparedStatements 的同时,我试图更透彻地了解 PreparedStatements 如何在客户端和服务器端工作。

那么如果我们有一些典型的增删改查操作,在应用中反复更新一个对象,用PS有用吗?我知道我们每次都必须关闭 PS,否则会导致游标泄漏。

那么它对性能有何帮助?驱动程序是否会缓存预编译语句并在我下次执行 connection.prepareStatement 时给我一份副本?或者数据库服务器有帮助吗?

我理解关于 PreparedStatements 的安全优势的争论,我很欣赏下面强调它的答案。然而,我真的想让这个讨论集中在 PreparedStatements 的性能优势上。

更新:当我说更新数据时,我的意思更多是指随机调用多次的方法。我理解下面提供的答案的优势,该答案要求在循环内重新使用该语句。

     // some code blah blah
    update();

    // some more code blah blah
    update();

....

public void update () throws SQLException{
 try{
      PreparedStatement ps = connection.prepareStatement("some sql");
      ps.setString(1, "foobar1");
      ps.setString(2, "foobar2");
      ps.execute();
 }finally {
     ps.close();

 }

}

没有办法实际重用“ps”java 对象,我知道实际的 connection.prepareStatement 调用非常昂贵。

这让我回到了最初的问题。这个“一些 sql”PreparedStatement 是否仍然在我不知道的情况下被缓存和重用?

我还应该提到我们支持多个数据库。

提前致谢。

原文由 Kapsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
1 个回答

准备好的语句主要与性能有关的概念是一种误解,尽管它很常见。

另一位发帖人提到,他注意到 Oracle 和 SQL Server 的速度提高了大约 20%。我注意到 MySQL 有一个类似的数字。事实证明,解析查询并不是所涉及工作的重要部分。在一个非常繁忙的数据库系统上,查询解析是否会影响整体吞吐量也不清楚:总的来说,它可能只是用完了 CPU 时间,否则这些时间在数据从磁盘返回时会空闲。

所以作为使用prepared statements的一个原因, 对SQL注入攻击的保护远远超过 了性能的提升。如果您不担心 SQL 注入攻击,您可能应该…

原文由 Neil Coffey 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题