执行更新被阻止
executeUpdate blocked
当代码到达步骤 "pstmt.executeUpdate()" 时,它冻结并阻塞,我没有收到任何 SQL 异常
这是有效的:
SQL = "INSERT INTO Procedure (file_path,id) VALUES ('/test/file_test.pdf',512);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
这不行!我没有收到任何异常,它被阻止了:
SQL = "INSERT INTO Procedure (file_path,id) VALUES (?,?);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();
我不明白为什么我的代码在使用下一个解决方案时被阻止(我的意思是 setString
和 setInt
)。
procedure
是 SQL 中的保留关键字。可能是由于这个原因造成的。
将过程 table 名称更改为其他名称并尝试。
您也可以尝试将 Procedure 更改为 `Procedure`。
希望这对你有用。
使用 Try/Catch 和调试器将为您提供有关该问题的更多信息。我过去遇到过类似的问题,这就是我解决它的方法。我不确定问题出在哪里,但试试这个
public void getCar(String carName) {
String[] key = {"PRIMARY_KEY_COLUMN"};
try(Connection con = super.getConnection()) {
String queryOne = "INSERT INTO Procedure (file_path,id) VALUES (?,?)";;
try(PreparedStatement pstmt = con.prepareStatement(queryOne, key)){
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();
int generatedKey = getGeneratedKey(pstmt));
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
// Do somthing if connection is set but exception thrown
}
} catch (SQLException e) {
e.printStackTrace();
// Do somthing else if connection couldn't be set
}
}
private int getGeneratedKey(PreparedStatement pstmt) throws SQLException {
int generatedKey = 0;
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
generatedKey = rs.getInt(1);
}
rs.close();
return generatedKey;
}
大家好,错误已找到并已修复
Bug 的原因:例如,假设我们有 2 table B[Id, othercolumn] 和 A[Id, pathfile,fk_id_B]
我在 table B 上开始了一个开始交易(更新记录 id=512)
但是我忘记关闭事务 (connection.commit();connection.close()) 之前我盯着其他人在 A 上开始事务所以导致此冻结,因为预览仍然使用记录 (id=512)交易
解决方案:在 A 上开始交易之前,我在 B
上关闭交易
感谢大家的帮助和参与:)
当代码到达步骤 "pstmt.executeUpdate()" 时,它冻结并阻塞,我没有收到任何 SQL 异常
这是有效的:
SQL = "INSERT INTO Procedure (file_path,id) VALUES ('/test/file_test.pdf',512);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
这不行!我没有收到任何异常,它被阻止了:
SQL = "INSERT INTO Procedure (file_path,id) VALUES (?,?);";
pstmt = con.prepareStatement(SQL,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();
我不明白为什么我的代码在使用下一个解决方案时被阻止(我的意思是 setString
和 setInt
)。
procedure
是 SQL 中的保留关键字。可能是由于这个原因造成的。
将过程 table 名称更改为其他名称并尝试。
您也可以尝试将 Procedure 更改为 `Procedure`。
希望这对你有用。
使用 Try/Catch 和调试器将为您提供有关该问题的更多信息。我过去遇到过类似的问题,这就是我解决它的方法。我不确定问题出在哪里,但试试这个
public void getCar(String carName) {
String[] key = {"PRIMARY_KEY_COLUMN"};
try(Connection con = super.getConnection()) {
String queryOne = "INSERT INTO Procedure (file_path,id) VALUES (?,?)";;
try(PreparedStatement pstmt = con.prepareStatement(queryOne, key)){
pstmt.setString(1, "/test/file_test.pdf");
pstmt.setInt(2, 512);
pstmt.executeUpdate();
int generatedKey = getGeneratedKey(pstmt));
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
// Do somthing if connection is set but exception thrown
}
} catch (SQLException e) {
e.printStackTrace();
// Do somthing else if connection couldn't be set
}
}
private int getGeneratedKey(PreparedStatement pstmt) throws SQLException {
int generatedKey = 0;
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
generatedKey = rs.getInt(1);
}
rs.close();
return generatedKey;
}
大家好,错误已找到并已修复
Bug 的原因:例如,假设我们有 2 table B[Id, othercolumn] 和 A[Id, pathfile,fk_id_B] 我在 table B 上开始了一个开始交易(更新记录 id=512) 但是我忘记关闭事务 (connection.commit();connection.close()) 之前我盯着其他人在 A 上开始事务所以导致此冻结,因为预览仍然使用记录 (id=512)交易 解决方案:在 A 上开始交易之前,我在 B
上关闭交易感谢大家的帮助和参与:)