【问题标题】:which one would be better between these two?这两者之间哪个更好?
【发布时间】:2018-11-23 15:23:02
【问题描述】:

我正在尝试从板上获取 COUNT(*),

但我想知道以下代码的性能会更好:

Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM board_*** WHERE article_category = " + foo);

PreparedStatement pstmt = connection.prepareStatement("SELECT COUNT(*) FROM board_*** WHERE article_category = ?");
pstmt.setInt(1 , foo);
ResultSet rs = pstmt.executeQuery();

很难决定..

【问题讨论】:

  • 绝对是第二个,因为您没有直接在查询中插入可能是恶意的数据。但这更多地与安全有关。
  • 没那么难,考虑到性能和安全隐患,PreparedStatement 更好
  • 如果您必须在这两个选项之间进行选择,那么将第一个选项认为 更好 的情况很少,甚至可能没有。拿2号!
  • 如果你只执行一次,它们将花费相同的时间,但第二次更安全。如果您使用不同的参数多次执行此操作,则第二次将更安全、更快。选择真的不难。一旦有了动态参数,就使用准备好的语句。就这么简单。如果你想让这个速度更快,你应该担心的是:我是否在 article_category 上定义了一个索引?
  • 谢谢!但是如果 'foo' 是整数呢?它仍然会影响安全含义和性能吗?

标签: java mysql servlets


【解决方案1】:

使用PreparedStatement 总是好的。因为如果更安全(来自 sql 注入)并且在性能方面它更快,因为当您使用绑定变量时,数据库服务器本身会缓存参数并提高查询性能。

如果你对这里更感兴趣,可以阅读一篇好论文

http://www.oracle.com/technetwork/database/performance/designing-applications-for-performa-131870.pdf

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多