tha*_*ran 4 java sql oracle jdbc
我使用一段简单的代码更新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)
Run Code Online (Sandbox Code Playgroud)
Vin*_*rat 12
你永远不应该通过连接像这样的变量来创建语句.这使您可以打开SQL注入.此外,Oracle会将每个语句视为一个新语句,需要进行硬解析,这可能会导致性能问题.而是使用preparedStatement.
但是,我认为在你的情况下,这不是你的问题的原因.当简单的更新挂起时,几乎总是这些原因之一:
我很确定你是第一种情况.出于一致性原因,Oracle会阻止多个用户同时更新同一行.这意味着如果修改的行被锁定,DML语句将等待另一个事务.它将等待阻塞事务提交或回滚.
我建议你在尝试通过SELECT ... FOR UPDATE NOWAIT之前做一次更新之前总是锁定一行.如果该行已被锁定,则会失败,您可以通过告诉用户此行当前被另一个会话锁定而正常退出.
您还必须确保没有事务以非公共状态结束.所有会话应在退出之前提交或回滚其更改(尽管不使用自动提交).
| 归档时间: |
|
| 查看次数: |
14893 次 |
| 最近记录: |