動態數據源的實現源碼(連接池)

作的是c3p0的鏈接池配置!因此請先下載相關的c3p0.jar包以及鏈接池包 mysql

/**
 * 該類是初始化鏈接池 或則獲得鏈接
 * @author SkyWen
 *
 */
public class DynamicDataSourcePool {
 private static final Log log = LogFactory.getLog(DynamicDataSourcePool.class);
 private ComboPooledDataSource pool=null;//申明C3p0數據鏈接池變量
 /**
  * 默認的構造方法
  * @param userName  數據庫用戶名
  * @param pass      數據庫密碼
  * @param url       鏈接的url
  * @param driverClass  數據驅動
  */
 public DynamicDataSourcePool(String userName,String pass,String url,String driverClass) {
  try {
   this.pool=new ComboPooledDataSource();//建立對象
   this.pool.setDriverClass(driverClass);//設置驅動
   this.pool.setJdbcUrl(url); //設置鏈接的url
   this.pool.setUser(userName);//設置數據庫用戶名
   this.pool.setPassword(pass);//設置數據庫密碼
   this.pool.setAcquireIncrement(3);//當鏈接池中的鏈接耗盡的時候c3p0一次同時獲取的鏈接數
   this.pool.setAutoCommitOnClose(false);//鏈接關閉時默認將全部未提交的操做回滾
   this.pool.setBreakAfterAcquireFailure(false);//獲取鏈接失敗後該數據源將申明已斷開並永久關閉
   this.pool.setCheckoutTimeout(1000);//當鏈接池用完時客戶端調用getConnection()後等待獲取新鏈接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒。
   this.pool.setIdleConnectionTestPeriod(60);//每60秒檢查全部鏈接池中的空閒鏈接
   this.pool.setInitialPoolSize(10);//初始化時獲取10個鏈接,取值應在minPoolSize與maxPoolSize之間
   this.pool.setMaxPoolSize(40);//鏈接池中保留的最大鏈接數
   this.pool.setMinPoolSize(5);//鏈接池最小鏈接數
   this.pool.setMaxIdleTime(60);//最大空閒時間,60秒內未使用則鏈接被丟棄
   this.pool.setNumHelperThreads(3);//c3p0是異步操做的,緩慢的JDBC操做經過幫助進程完成。擴展這些操做能夠有效的提高性能經過多線程實現多個操做同時被執行
   log.info("數據庫鏈接池初始化成功");
  } catch (PropertyVetoException e) {
   e.printStackTrace();
  }
 }
    /**
    * 獲得鏈接
    * @return
    */
 public Connection  getConnection(){
  try {
   return this.pool.getConnection();
  } catch (SQLException e) {
   log.info("獲取鏈接異常");
   e.printStackTrace();
  }
  return null;
 }
 /**
  * 關閉
  */
 public void destroy(){
  if(null!=this.pool)this.pool.close();
 }
} sql

以上這個類是初始化鏈接池!下面DynamicDataSourcePoolFactory類是鏈接池的工廠 數據庫

/**
 * 該類是鏈接池的管理類
 * @author SkyWen
 *
 */
public class DynamicDataSourcePoolFactory {
 private static Hashtable<String , DynamicDataSourcePool> hashtable=null;
 private static DynamicDataSourcePoolFactory dataSourcePoolFactory;
 private DynamicDataSourcePoolFactory(){
 } 
 public static DynamicDataSourcePoolFactory getInstance(){
  if(null==dataSourcePoolFactory){
   hashtable=new Hashtable<String , DynamicDataSourcePool>();
   dataSourcePoolFactory=new DynamicDataSourcePoolFactory();
  }
  return dataSourcePoolFactory;
 }
 
 /**
  * 綁定鏈接池
  * @param key 鏈接池的名稱必須惟一
  * @param dataSourcePool 對應的鏈接池
  */
 public void bind(String key,DynamicDataSourcePool dataSourcePool){
  if(IsBePool(key))getDynamicDataSourcePool(key).destroy(); 
  hashtable.put(key, dataSourcePool);
 }
 
 /**
  * 從新綁定鏈接池
  * @param key 鏈接池的名稱必須惟一
  * @param dataSourcePool 對應的鏈接池
  */
 public void rebind(String key,DynamicDataSourcePool dataSourcePool){
  if(IsBePool(key))getDynamicDataSourcePool(key).destroy(); 
  hashtable.put(key, dataSourcePool);
 }
 
 /**
  * 刪除動態數據鏈接池中名稱爲key的鏈接池
  * @param key
  */
 public void unbind(String key){
  if(IsBePool(key))getDynamicDataSourcePool(key).destroy(); 
  hashtable.remove(key);
 }
 
 /**
  * 查找動態數據鏈接池中是否存在名稱爲key的鏈接池
  * @param key
  * @return
  */
 public boolean IsBePool(String key){
  return hashtable.containsKey(key);
 }
 
 /**
  * 根據key返回key對應的鏈接池
  * @param key
  * @return
  */
 public DynamicDataSourcePool getDynamicDataSourcePool(String key){
  if(!IsBePool(key))return null;
  return (DynamicDataSourcePool)hashtable.get(key);
  
 }
}
下面這個類是個測試的類DynamicDataSourcePoolTest!我用的是mysql數據庫!其中我只是添加了一個實例!能夠本身在添加一個!若是有朋友不懂的話 請給我留言 多線程

String localurl="jdbc:mysql://127.0.0.1:3306/skywen?useUnicode=true&amp;characterEncoding=gbk"; 異步

DynamicDataSourcePool  dataSourcePool1=new DynamicDataSourcePool("aa","aa",localurl,"com.mysql.jdbc.Driver"); 性能

DynamicDataSourcePoolFactory factory=DynamicDataSourcePoolFactory.getInstance(); 測試

/*實體類的對象*/ ui

GameServer gameServer=new GameServer();
  factory.bind(Key.getKey(gameServer), dataSourcePool1); this

/*判讀是否存在這個鏈接池*/
  System.out.println(factory.IsBePoolKey.getKey(gameServer)); url

 /*獲得鏈接*/   Connection connection161=factory.getDynamicDataSourcePool(Key.getKey(gameServer)).getConnection();

相關文章
相關標籤/搜索