2016-03-09 60 views
1

解決提到的問題here使用多個數據庫連接導致死鎖

我們正在創建和使用2個相同的JDBC單例連接(Regular,Proxy)。

  • 但是通過這樣做,當我們嘗試在同一個表上連續使用兩個連接以進行多次插入和更新時,我們正面臨死鎖。
  • 發生這種情況時,我無法從數據庫工具(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(); 
} 

問:

  • 如何解決這個問題?
  • 如何確保不同的連接,雖然他們使用相同的類加載器創建,但不會鎖定數據庫/表。

感謝

+1

使用兩個連接是國際海事組織不是一個好主意。如果步驟3修改了在步驟2中鎖定的數據,則會出現該行爲。我認爲您在Oracle中需要類似* autonomous transaction *的內容 - 請參閱[this](http://stackoverflow.com/questions/26866521/autonomous-transactions-in -sybase-ase-15-5)有所幫助。 –

+0

@up我完全同意。如果需要從2個不同的數據庫獲取數據,則可以使用兩個連接。 – FilMiOs

+0

@MarmiteBomber我同意但如何解決這裏提到的問題http://stackoverflow.com/questions/35800951/jdbc-transaction-control-in-sybase – SRJ

回答

0

我在這裏不是專家,但運行的查詢,然後忘記提交(或取消)時,我曾經有過與Oracle數據庫的問題。所以我認爲在步驟2之後沒有提交的事實會鎖定下一次訪問的數據庫。

+0

我不想在第2步之後提交。我想在第3步之後提交,以使我的回滾工作用於常規連接。 – SRJ