デッドロックの削減に取り組んでおり、デッドロックの原因となるトランザクションがコミットされて開かれない可能性があるため、1つの接続で複数のクエリを使用しないでください。だから、擬似コード、このようなもので:自動コミットがtrueに設定されている場合自動コミット時のJDBC
try(Connection con = datasource.getConnection())
{
PreparedStatement stm1 = con.prepareStatement(getSQL());
stm1.setString(1, owner);
stm1.setTimestamp(2, Timestamp.valueOf(LocalDateTime.now()));
stm1.setInt(3, count);
int updateCount = stm1.executeUpdate();
stm1.close();
PreparedStatement stm2 = con.prepareStatement(getSQL2());
stm2.setString(1, owner);
ResultSet rs = stm2.executeQuery();
List<Object> results = new ArrayList<>();
while(rs.next()) {
results.add(create(rs));
}
return results;
} catch (SQLException e) {
throw new RuntimeException("Failed to claim message",e);
}
STM1は、トランザクションをコミットしない場合は?
このような接続を再利用するか、どちらのステートメントでも別の接続を使用することをお勧めしますか?
'stm1.executeUpdate();'が呼び出されると、最初のステートメントはすぐにコミットされます。 – Kayaman
私は接続を開くにはオーバーヘッドがあるので、接続を再利用しようとします。また、sql1とsql2を連結している場合は、1つの呼び出しを行うこともできます。 –
Sql 1は更新プログラムですが、2はその更新プログラムによって選択されます。 Sql1は別の更新プログラムでデッドロックを発生させます。そのため、sql2が長すぎるトランザクションを開いてそのデッドロックを引き起こしているのではないかと思いました。どちらの場合でも、1つのクエリで表現することはできません – pandaadb