解决提到的问题here .
我们正在创建并使用 2 个相同的 JDBC 单例连接(常规、代理)。
- 但是,通过这样做,当我们尝试在同一个表上连续使用两个连接来执行多次插入和更新时,我们将面临死锁。
- 发生这种情况时,我也无法从数据库工具 (Aqua Data Studio) 运行任何查询。
- 我的假设是它无限期地等待其他连接释放锁定。
注意:我们在这里不处理多线程。
问题:
// Auto Commit false
// Singelton
Connection connection = getConnection(); //same
// Auto Commit true
// // Singelton
Connection proxyConnection= getConnection(); //same
PreparedStatement ps = null;
try{
connection.setAutoCommit(false);
//Step 1
String sql = getQuery();
ps = proxyConnection.prepareStatement(sql);
ps.executeUpdate();
.
.
//Step 2
// if I don't execute this step everything works fine.
sql = getTransctionQuery();
ps = connection.prepareStatement(sql);
ps.executeUpdate();
.
.
//Step 3
sql = getQuery();
ps = proxyConnection.prepareStatement(sql);
ps.executeUpdate(); // this line never completes (if Step 2 runs)
}catch(){
connection.rollback(); //Doesn’t rollback step 1 and understandably step 2.
}
finally{
connection.close(); //cleanup code
proxyConnection.close();
}
问题:
- 如何解决此问题?
- 如何确保不同的连接(尽管它们是使用相同的类加载器创建)不会锁定数据库/表。
谢谢
最佳答案
我不是这方面的专家,但我曾经在运行查询时遇到 Oracle DB 问题,然后忘记提交(或取消)。因此,我认为您在第 2 步后未提交的事实会锁定数据库以供下次访问。
关于java - 使用多个数据库连接会导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903283/