【问题标题】:Execution time of consecutive executeUpdate() SQL statements连续executeUpdate() SQL语句的执行时间
【发布时间】:2012-07-10 15:20:58
【问题描述】:

在 SQL 数据库上使用多个连续的 executeUpdate() 方法有多安全?

考虑 2 个语句:

st.executeUpdate("INSERT table SELECT col1,col2 FROM table WHERE ID=" +var_id);
st.executeUpdate("DELETE FROM table WHERE ID=" +var_id);

他们的行为如何?第二条语句是等待第一条语句的完成,还是我们应该检查返回值(受影响的行数)并根据第二条语句采取相应的行动?

【问题讨论】:

  • 取决于您的连接是否设置为自动提交。您使用的是什么 JDBC 驱动程序?
  • 我想这取决于方法是否是异步的。如果它返回一个代码(例如,一个直整数,如 100 - '未找到行'),则表示它已完成。 始终检查此类代码。此外,您目前对 SQL 注入持开放态度;使用准备好的语句。
  • 如果你的连接开启了自动提交,它将提交每一个事务,上面的操作是绝对安全的。即使您没有启用自动提交,它也应该是安全的,但您需要记住手动提交或回滚。如果您希望在第二条语句失败的情况下回滚第一条语句,那么您需要关闭自动提交。大多数 JDBC 驱动程序默认自动提交(至少我认为 JTDS 会这样做)。

标签: java sql sql-server tsql sql-update


【解决方案1】:

executeUpdate 的调用不是异步的,因此在服务器上执行语句之前它不会返回。换句话说:这两个语句将起作用并且它们不会相互干扰,因为它们一个接一个地执行。

【讨论】:

    【解决方案2】:

    我不认为该语句可以作为一个单个实例同时执行多个查询。

    第二个语句将等到第一个语句完成并返回
    第二个语句只会在第一个语句完成后设置新查询。

    这也适用于读取 ResultSet 的情况。
    文档说:

    默认情况下,每个 Statement 对象只能同时打开一个 ResultSet 对象。因此,如果一个 ResultSet 对象的读取与另一个 ResultSet 对象的读取交错,则每个对象都必须由不同的 Statement 对象生成。 Statement 接口中的所有执行方法都会隐式关闭一个语句的当前 ResultSet 对象,如果存在打开的对象。

    【讨论】:

    • 不确定您所说的“单个实例”是什么意思,但肯定一个 Statement 对象可以在同一个事务中执行多个 SQL 语句。您可以使用 addBatch 和 executeBatch 方法在同一个事务中执行多个语句。
    • executeUpdate 不返回 ResultSet。我只是不确定第二个语句是否只会在第一个语句完成后执行。应该的,但我有片刻的怀疑。现在尝试并获得 NullPointerException。
    • 是的。我知道 executeBatch 和 executeUpdate 不返回结果集。我不认为 OP 正在使用添加批处理命令。结果集仅作为单语句对象的类似操作的示例。
    • executeUpdate 确实会返回受影响的行数,因此它需要等待语句完成。
    • @MarkRotteveel 是的。即使在批量更新中,下一个批量查询也会在第一个查询完成后执行,无论它成功还是失败。参考executeBatch
    【解决方案3】:

    答案取决于您是否为数据库启用了自动提交。

    如果你开启了自动提交,第二条语句将等待第一条语句完成并在执行前提交。

    如果您关闭了自动提交,第二条语句将在第一条语句之后执行,但在提交之前不会对数据库应用任何更改。

    【讨论】:

    • 这不依赖于autoCommit,在这两种情况下,对executeexecuteUpdate等的调用只会在数据库执行完语句后返回。
    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 2013-08-18
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多