CP30資料連線池死鎖

菜雞03號發表於2016-09-09
在公司的專案開發中,我負責資料層介面的程式碼編寫工作,其中,就涉及到mysql資料庫的查詢介面。為提供效能,也使用了C3P0這個連線池技術。配置簡單,也好用。這裡說一下,我們的使用環境;由於是給中介軟體層使用,而中介軟體並沒有向web層那樣,有配置spring和hibernate,因此,這些查詢介面只是使用了c3p0來管理資料庫連線。

       和很多網友一樣,碰到了死鎖的這個問題,資訊類似如下:

       WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4b9cafa7 -- APPARENT DEADLOCK!!! Complete Status:
          Managed Threads: 3
          Active Threads: 3

        通過中介軟體的日誌發現:中介軟體多個應用在同時啟動時,肯定報這個警告;有兩臺伺服器在凌晨4點左右,幾乎同時報這個警告。奇怪的是,貌似業務沒有受到影響。之後,在網上查詢了很多資料和部落格,貌似沒用。這裡想說的是,解決問題還是要從自身的應用環境出發;在進行測試時,儘量模擬真實的環境,不要只是能用就行。

        既然,中介軟體多個應用在同時啟動時,肯定報這個警告,那就模擬一下。在eclipse中,同時啟動三個同一個測試用例(三個不同的程式);果然,三個測試用例都報了這個警告。為什麼呢?因為中介軟體使用的是,我提供的介面,自然C3P0的配置檔案也是一樣的;如果說,這裡邊有什麼衝突的話,那就是這些資料來源的名稱是相同了。修改後,在資料來源的名稱後面加上一些隨機字元,再次進行測試,啟動就沒有報這個錯誤了。再在中介軟體的伺服器上進行測試,啟動沒有報這個警告了。

        一些網友,也提到C3P0在配置多資料來源時,容易出現死鎖的問題,下面給出一個部落格連結:http://www.2cto.com/database/201411/349966.html

       另外,在配置連線池單例時,在多執行緒獲取連線時,也容易出現獲取連線超時的問題,你可以需要按照下面這樣修改程式碼:

      

  1. public <span style="color:#ff0000;">synchronized</span> final Connection getConnection() {  
  2.         try {  
  3.                 return ds.getConnection();  
  4.         } catch (SQLException e) {  
  5.                 e.printStackTrace();  
  6.         }  
  7.         return null;  
  8.     }  

相關文章