1. 程式人生 > >使用C3P0時,資料庫連結死鎖的解決

使用C3P0時,資料庫連結死鎖的解決

使用C3P0 連結池,一開始沒有設定timeout,死鎖不釋放,造成程式卡死。

dataSource.setDriverClass("com.mysql.jdbc.Driver");


       dataSource.setJdbcUrl(url);//設定連線資料庫的URL  
                
       dataSource.setUser(user);//設定連線資料庫的使用者名稱
                
       dataSource.setPassword(password);//設定連線資料庫的密碼  
                
       dataSource.setMaxPoolSize(20);//設定連線池的最大連線數
                
       dataSource.setMinPoolSize(10);//設定連線池的最小連線數
                
       dataSource.setInitialPoolSize(10);//設定連線池的初始連線數
                
       dataSource.setMaxStatements(500);//設定連線池的快取Statement的最大
       
       dataSource.setCheckoutTimeout(20000);//當連線池用完時客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。Default: 0
       

       dataSource.setMaxIdleTime(3000); //最大空閒時間,1800秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0

1. 在程式中

A{

conn = getConnection,

calll B(conn)

{

     getConnection()

      call C()

     {

           getConection()

      }

     releaseConnection()

}

releaseConnection

}

在這種巢狀的呼叫中,conn還有傳遞

如果一個地方沒有及時釋放,最終導致死鎖。 A要獲取連結,沒有,B在等待釋放,A還在等著B返回,再釋放連結。

使用的連結的正確方法

獲取連結。立刻操作資料庫,操作完資料庫,立刻將連結釋放。 不要一層層將連結往子函式裡面傳。

原則:

 連結操作資料庫,立刻釋放。不要一直佔著

 資料庫連結設定超時,超時自動釋放