使用C3P0時,資料庫連結死鎖的解決
阿新 • • 發佈:2019-02-11
使用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返回,再釋放連結。
使用的連結的正確方法
獲取連結。立刻操作資料庫,操作完資料庫,立刻將連結釋放。 不要一層層將連結往子函式裡面傳。
原則:
連結操作資料庫,立刻釋放。不要一直佔著
資料庫連結設定超時,超時自動釋放