当前位置:  开发笔记 > 编程语言 > 正文

准备好的声明和表现

如何解决《准备好的声明和表现》经验,为你挑选了4个好方法。

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

我们有一个Java应用程序,我们使用常规的'Statement'比使用'PreparedStatement'更多.在尝试使用更多PreparedStatements时,我试图更全面地了解PreparedStatements如何工作 - 在客户端和服务器端.

因此,如果我们有一些典型的CRUD操作并在应用程序中重复更新对象,它是否有助于使用PS?我知道每次都要关闭PS,否则会导致光标泄漏.

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

我理解关于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仍然被缓存并重新使用在我不知道的封面下吗?

我还要提一下,我们支持几个数据库.

提前致谢.



1> Neil Coffey..:

准备好的陈述主要是关于绩效的概念是一种误解,尽管这是一个很常见的陈述.

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

因此,作为使用预准备语句的原因,针对SQL注入攻击保护远远超过了性能改进.如果你不担心SQL注入攻击,你可能应该......


"它可能只是耗尽CPU时间,否则在数据从磁盘返回时会闲置" - 这取决于所涉及的系统和查询.我使用的数据库系统具有适度的CPU资源,但是大量的并行磁盘容量.可以说系统设计得很糟糕,但是系统肯定是CPU限制的,所以我们可以做的就是提高CPU利用率(例如更少的查询解析)确实有所作为.
我不相信sql性能提升只有20%.那个基准在哪里?但是你对sql注入的看法很好.我仍然认为说性能提升仅为20%是误导性的

2> Mr. Shiny an..:

准备好的语句可以在重新使用您准备的相同语句时提高性能:

PreparedStatement ps = connection.prepare("SOME SQL");

for (Data data : dataList) {
  ps.setInt(1, data.getId());
  ps.setString(2, data.getValue();
  ps.executeUpdate();
}

ps.close();

这比在循环中创建语句快得多.

某些平台还会缓存预准备语句,这样即使您关闭它们,也可以更快地重建它们.

但是,即使性能相同,您仍应使用预准备语句来阻止SQL注入.在我的公司,这是一个面试问题; 弄错了,我们可能不会雇用你.



3> Jon..:

准备好的语句在首次使用后确实被缓存,这是它们在性能上比标准语句提供的.如果您的陈述没有改变,那么建议使用此方法.它们通常存储在语句高速缓存中以供更改使用.

更多信息可以在这里找到:

http://www.theserverside.com/tt/articles/article.tss?l=Prepared-Statments

您可能希望将Spring JDBCTemplate视为直接使用JDBC的替代方法.

http://static.springframework.org/spring/docs/2.0.x/reference/jdbc.html



4> duffymo..:

解析SQL并不是唯一正在发生的事情.验证表和列确实存在,创建查询计划等.您使用PreparedStatement支付一次.

事实上,绑定以防止SQL注入是一件非常好的事情.IMO,还不够.您仍应在进入持久层之前验证输入.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有