因爲原先使用的c3p0鏈接池,時常出現:APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks,以及出現線程死鎖的情況導致服務器經常需要重啓,很是頭疼。所以考慮使用Druid 鏈接池來代替原先的c3p0.
package db.conn;
import java.sql.Connection;
//引入站點的配置信息
import config.Config;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 數據庫連接生成類,返回一個數據庫連接對象
* 構造函數完成數據庫驅動的加載和數據的連接
* 提供數據庫連接的取得和數據庫的關閉方法
* @author yuyu
*
*/
public class DbConnect {
private static DruidDataSource dataSourceMDB=null;
private static DruidDataSource dataSourceSSO=null;
public String db;
/**
* 構造函數完成數據庫的連接和連接對象的生成
* @throws Exception
*/
public DbConnect(){
}
public void GetDbConnectSSO() throws Exception {
try{
if(dataSourceSSO==null){
dataSourceSSO=new DruidDataSource();
//設置連接參數
dataSourceSSO.setUrl(Config.DBURL);
dataSourceSSO.setDriverClassName(Config.DBDRIVER);
dataSourceSSO.setUsername(Config.DBUSER);
dataSourceSSO.setPassword(Config.DBPASSWORLD);
//配置初始化大小、最小、最大
dataSourceSSO.setInitialSize(1);
dataSourceSSO.setMinIdle(1);
dataSourceSSO.setMaxActive(20);
//連接泄漏監測
dataSourceSSO.setRemoveAbandoned(true);
dataSourceSSO.setRemoveAbandonedTimeout(30);
//配置獲取連接等待超時的時間
dataSourceSSO.setMaxWait(20000);
//配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
dataSourceSSO.setTimeBetweenEvictionRunsMillis(20000);
//防止過期
dataSourceSSO.setValidationQuery("SELECT 'x'");
dataSourceSSO.setTestWhileIdle(true);
dataSourceSSO.setTestOnBorrow(true);
}
}catch(Exception e){
throw e;
}
}
public void GetDbConnectMDB() throws Exception {
try{
if(dataSourceMDB==null){
dataSourceMDB=new DruidDataSource();
//設置連接參數
dataSourceMDB.setUrl(Config.MDB_DBURL);
dataSourceMDB.setDriverClassName(Config.DBDRIVER);
dataSourceMDB.setUsername(Config.MDB_DBUSER);
dataSourceMDB.setPassword(Config.MDB_DBPASSWORLD);
//配置初始化大小、最小、最大
dataSourceMDB.setInitialSize(1);
dataSourceMDB.setMinIdle(1);
dataSourceMDB.setMaxActive(20);
//連接泄漏監測
dataSourceMDB.setRemoveAbandoned(true);
dataSourceMDB.setRemoveAbandonedTimeout(30);
//配置獲取連接等待超時的時間
dataSourceMDB.setMaxWait(20000);
//配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
dataSourceMDB.setTimeBetweenEvictionRunsMillis(20000);
//防止過期
dataSourceMDB.setValidationQuery("SELECT 'x'");
dataSourceMDB.setTestWhileIdle(true);
dataSourceMDB.setTestOnBorrow(true);
}
}catch(Exception e){
throw e;
}
}
/**
* 取得已經構造生成的數據庫連接
* @return 返回數據庫連接對象
* @throws Exception
*/
public Connection getConnect(String str) throws Exception{
Connection con=null;
this.db=str;
try {
if(db.equals("MDB")){
GetDbConnectMDB();
con=dataSourceMDB.getConnection();
}else if(db.equals("SSO")){
GetDbConnectSSO();
con=dataSourceSSO.getConnection();
}
} catch (Exception e) {
throw e;
}
return con;
}
}