gpt4 book ai didi

java - java中的executeUpdate()需要很长时间才能执行

转载 作者:搜寻专家 更新时间:2023-11-01 01:17:19 24 4
gpt4 key购买 nike

我正在使用一段简单的代码来更新 Oracle DB 中的单行,查询只更新单行但执行仍然卡在 stmt.executeUpdate() 上。

它不会抛出任何异常,但控件只是卡在那里。

我在这里迷路了,因为同一段代码之前运行良好。

  try {
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection(url,username,pwd);
stmt = conn.createStatement();
String sql = "update report set status =" +"'"+NO+"'"+ " where name=" +"'"+ name+"'"+ " and user_id=" +"'"+sub+"'";
System.out.println(sql);
stmt.executeUpdate(sql)

最佳答案

你永远不应该通过像这样连接变量来创建语句。这使您可以打开 SQL injection .此外,每个语句都将被 Oracle 视为需要硬解析的新语句,这可能会导致性能问题。相反,使用 preparedStatement .

但是,我认为您的情况不是问题的原因。当一个简单的更新挂起时,几乎总是以下原因之一:

  1. 该行被另一个事务锁定。
  2. 您正在更新一个键,该键被另一个表引用为 unindexed foreign key .
  3. 该表有一个执行大量工作的 ON UPDATE 触发器。

我很确定您属于第一种情况。 Oracle 防止多个用户同时更新同一行,主要是出于一致性原因。这意味着如果修改的行被锁定,DML 语句将等待另一个事务。它将等到阻塞事务提交或回滚。

我建议您在尝试通过执行 SELECT ... FOR UPDATE NOWAIT 更新之前始终锁定行。如果该行已被锁定,这将失败,您可以通过告诉用户该行当前正被另一个 session 锁定来正常退出。

您还必须确保没有事务以未提交状态结束。所有 session 都应该在退出前提交或回滚他们的更改(尽管不要使用自动提交)。

关于java - java中的executeUpdate()需要很长时间才能执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com