java - PreparedStatements 和绩效

标签 java database performance prepared-statement

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

我们有一个 Java 应用程序,在该应用程序中,我们使用常规的“语句”比使用“PreparedStatement”要多。在尝试使用更多 PreparedStatements 的同时,我试图更全面地了解 PreparedStatements 的工作原理 - 在客户端和服务器端。

那么如果我们有一些典型的 CRUD 操作并且在应用程序中重复更新一个对象,使用 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 是否仍然在我不知道的情况下被缓存和重用?

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

提前致谢。

最佳答案

Prepared statements 主要是关于性能的概念是一种误解,尽管它很常见。

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

因此,作为使用预准备语句的一个原因,防止 SQL 注入(inject)攻击远远超过了性能改进。如果您不担心 SQL 注入(inject)攻击,您可能应该...

关于java - PreparedStatements 和绩效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/687550/

相关文章:

mysql - 表示数据库中的下拉列表值

java - 从文件中读取字符串最快的方法是什么?

java - 使用 ThreadLocal 进行日期转换

java - liferay 自定义 portlet 中的最大 language.properties 文件大小

Java 数据库编程 - 为什么这些值不是 "equal"?

javascript - _gaq.push( ['_trackPageLoadTime' ]) 是如何工作的?

c# - 存储过程之争

java - 有没有一种方法可以在appium中进行两根手指触摸?

java - 使用 JAX-RS 进行热重载

__str__() 方法上的 Django prefetch_related