亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 新建 文本文檔.txt

?? 數據庫連接池的JAVA代碼實現,超完美版
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
數據庫連接池的JAVA代碼實現

package scut.ailab.connectionpool;

import java.lang.reflect.*;

import java.sql.*;

/**

* @author youyongming

* 定義數據庫連接的代理類

*/

public class _Connection implements InvocationHandler {

//定義連接

private Connection conn = null;

//定義監控連接創建的語句

private Statement statRef = null;

private PreparedStatement prestatRef = null;

//是否支持事務標志

private boolean supportTransaction = false;

//數據庫的忙狀態

private boolean isFree = false;

//最后一次訪問時間

long lastAccessTime = 0;

//定義要接管的函數的名字

String CREATESTATE = "createStatement";

String CLOSE = "close";

String PREPARESTATEMENT = "prepareStatement";

String COMMIT = "commit";

String ROLLBACK = "rollback";

/**

* 構造函數,采用私有,防止被直接創建

* @param param 連接參數

*/

private _Connection(ConnectionParam param) {

  //記錄日至

  

   try{

   //創建連接

    Class.forName(param.getDriver()).newInstance();

    conn = DriverManager.getConnection(param.getUrl(),param.getUser(), param.getPassword());   

    DatabaseMetaData dm = null;

    dm = conn.getMetaData();

   //判斷是否支持事務

    supportTransaction = dm.supportsTransactions();

   }

   catch(Exception e)

   {

    e.printStackTrace();

   }

}

/* (non-Javadoc)

* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])

*/

public Object invoke(Object proxy, Method method, Object[] args)

   throws Throwable {

    Object obj = null;

   //判斷是否調用了close的方法,如果調用close方法則把連接置為無用狀態

    if(CLOSE.equals(method.getName()))

    {

    //設置不使用標志

     setIsFree(false);

    //檢查是否有后續工作,清除該連接無用資源

     if (statRef != null)

      statRef.close();

     if (prestatRef != null)

      prestatRef.close();

     return null;

    }

   //判斷是使用了createStatement語句

    if (CREATESTATE.equals(method.getName()))

    {

     obj = method.invoke(conn, args);

     statRef = (Statement)obj;//記錄語句

     return obj;

    }

   //判斷是使用了prepareStatement語句

    if (PREPARESTATEMENT.equals(method.getName()))

    {

     obj = method.invoke(conn, args);

     prestatRef = (PreparedStatement)obj;

     return obj;

    }

   //如果不支持事務,就不執行該事物的代碼

    if ((COMMIT.equals(method.getName())||ROLLBACK.equals(method.getName())) && (!isSupportTransaction()))

     return null;   

    obj = method.invoke(conn, args); 

   //設置最后一次訪問時間,以便及時清除超時的連接    lastAccessTime = System.currentTimeMillis();

    return obj;

}

/**

* 創建連接的工廠,只能讓工廠調用

* @param factory 要調用工廠,并且一定被正確初始化

* @param param 連接參數

* @return 連接

*/

static public _Connection getConnection(ConnectionFactory factory, ConnectionParam param)

{

   if (factory.isCreate())//判斷是否正確初始化的工廠

   {

    _Connection _conn = new _Connection(param);

    return _conn;

   }

   else

    return null;

}

public Connection getFreeConnection() {

  //返回數據庫連接conn的接管類,以便截住close方法

   Connection conn2 = (Connection)Proxy.newProxyInstance(

    conn.getClass().getClassLoader(),

    conn.getClass().getInterfaces(),this);

   return conn2;

}

/**

* 該方法真正的關閉了數據庫的連接

* @throws SQLException

*/

void close() throws SQLException{

  //由于類屬性conn是沒有被接管的連接,因此一旦調用close方法后就直接關閉連接

   conn.close();

}

   

public void setIsFree(boolean value)

{

   isFree = value;

}

public boolean isFree() {

   return isFree;

} 

/**

* 判斷是否支持事務

* @return boolean

*/

public boolean isSupportTransaction() {

   return supportTransaction;

} 

}

/*ConnectionFactory.java */

package scut.ailab.connectionpool;

/**

* @author youyongming

*

*/

import java.util.LinkedHashSet;

import java.sql.*;

import java.util.Iterator;

public class ConnectionFactory {

private static ConnectionFactory m_instance = null;

//在使用的連接池

private LinkedHashSet ConnectionPool = null;

//空閑連接池

private LinkedHashSet FreeConnectionPool = null;

//最大連接數

private int MaxConnectionCount = 4;

//最小連接數

private int MinConnectionCount = 2;

//當前連接數

private int current_conn_count = 0;

//連接參數

private ConnectionParam connparam = null;

//是否創建工廠的標志

private boolean isflag = false;

//是否支持事務

private boolean supportTransaction = false;

//定義管理策略

private int ManageType = 0;

private ConnectionFactory() {

   ConnectionPool = new LinkedHashSet();

   FreeConnectionPool = new LinkedHashSet();

}

/**

* 使用指定的參數創建一個連接池

*/

public ConnectionFactory(ConnectionParam param, FactoryParam fparam)

   throws SQLException 

{

  //不允許參數為空

   if ((param == null)||(fparam == null))

    throw new SQLException("ConnectionParam和FactoryParam不能為空");

   if (m_instance == null)

   {

    synchronized(ConnectionFactory.class){

     if (m_instance == null)

     {

     //new instance

     //參數定制

      m_instance = new ConnectionFactory();

      m_instance.connparam = param;

      m_instance.MaxConnectionCount = fparam.getMaxConn();

      m_instance.MinConnectionCount = fparam.getMinConn();

      m_instance.ManageType = fparam.getType();

      m_instance.isflag = true;

     //初始化,創建MinConnectionCount個連接

      System.out.println("connection factory 創建!");

      try{

       for (int i=0; i < m_instance.MinConnectionCount; i++)

       {

        _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);

        if (_conn == null) continue;

        System.out.println("connection創建");

        m_instance.FreeConnectionPool.add(_conn);//加入空閑連接池

        m_instance.current_conn_count ++;

       //標志是否支持事務

        m_instance.supportTransaction = _conn.isSupportTransaction();    

       }

      }

      catch(Exception e)

      {

       e.printStackTrace();

      }

     //根據策略判斷是否需要查詢

      if (m_instance.ManageType != 0)

      {

       Thread t = new Thread(new FactoryMangeThread(m_instance));

       t.start();

      } 

     }

    }

   }

}

/**

* 標志工廠是否已經創建

* @return boolean

*/ 

public boolean isCreate()

{

   return m_instance.isflag;

}

/**

* 從連接池中取一個空閑的連接

* @return Connection

* @throws SQLException

*/

public synchronized Connection getFreeConnection() 

   throws SQLException

{

   Connection conn = null;

  //獲取空閑連接

   Iterator iter = m_instance.FreeConnectionPool.iterator(;

   while(iter.hasNext()){

    _Connection _conn = (_Connection)iter.next();

   //找到未用連接

    if(!_conn.isFree()){

     conn = _conn.getFreeConnection();

     _conn.setIsFree(true);

    //移出空閑區

     m_instance.FreeConnectionPool.remove(_conn);

    //加入連接池 

     m_instance.ConnectionPool.add(_conn);   

     break;

    }

   }

  //檢查空閑池是否為空

   if (m_instance.FreeConnectionPool.isEmpty())

   {

   //再檢查是否能夠分配

    if (m_instance.current_conn_count < m_instance.MaxConnectionCount)

    {

   //新建連接到空閑連接池

     int newcount = 0 ;

    //取得要建立的數目

     if (m_instance.MaxConnectionCount - m_instance.current_conn_count >=m_instance.MinConnectionCount)

     {

      newcount = m_instance.MinConnectionCount;

     }

     else

     {

      newcount = m_instance.MaxConnectionCount - m_instance.current_conn_count;

     }

     //創建連接

     for (int i=0;i      {

      _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);

      m_instance.FreeConnectionPool.add(_conn);

      m_instance.current_conn_count ++;

     }

    }

    else

    {//如果不能新建,檢查是否有已經歸還的連接

     iter = m_instance.ConnectionPool.iterator();

     while(iter.hasNext()){

      _Connection _conn = (_Connection)iter.next();

      if(!_conn.isFree()){

       conn = _conn.getFreeConnection();

       _conn.setIsFree(false);

       m_instance.ConnectionPool.remove(_conn); 

       m_instance.FreeConnectionPool.add(_conn);   

       break;

      }

     }    

    }

   }//if (FreeConnectionPool.isEmpty())

//再次檢查是否能分配連接

   if(conn == null){

    iter = m_instance.FreeConnectionPool.iterator();

    while(iter.hasNext()){

     _Connection _conn = (_Connection)iter.next();

     if(!_conn.isFree()){

      conn = _conn.getFreeConnection();

      _conn.setIsFree(true);

      m_instance.FreeConnectionPool.remove(_conn); 

      m_instance.ConnectionPool.add(_conn);   

      break;

     }

    }

    if(conn == null)//如果不能則說明無連接可用

     throw new SQLException("沒有可用的數據庫連接");

   }

   System.out.println("get connection");

   return conn;

}

/**

* 關閉該連接池中的所有數據庫連接

* @throws SQLException

*/

public synchronized void close() throws SQLException

{

   this.isflag = false;

   SQLException excp = null;

  //關閉空閑池

   Iterator iter = m_instance.FreeConnectionPool.iterator();

   while(iter.hasNext()){

    try{

     ((_Connection)iter.next()).close();

     System.out.println("close connection:free");

     m_instance.current_conn_count --;

    }catch(Exception e){

     if(e instanceof SQLException)

      excp = (SQLException)e;

    }

   }

  //關閉在使用的連接池

   iter = m_instance.ConnectionPool.iterator();

   while(iter.hasNext()){

    try{

     ((_Connection)iter.next()).close();

     System.out.println("close connection:inused");

     m_instance.current_conn_count --;

    }catch(Exception e){

     if(e instanceof SQLException)

      excp = (SQLException)e;

    }

   }  

   if(excp != null)

    throw excp;

} 

/**

* 返回是否支持事務

* @return boolean

*/

public boolean isSupportTransaction() {

   return m_instance.supportTransaction;

}  

/**

* 連接池調度管理

*

*/

public void schedule()

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久亚洲毛片| 蜜臀a∨国产成人精品| 亚洲电影欧美电影有声小说| 精品一区二区在线看| 在线免费观看不卡av| 欧美韩国日本不卡| 国产在线精品一区二区三区不卡 | 在线亚洲免费视频| 国产三级三级三级精品8ⅰ区| 日韩精品欧美成人高清一区二区| 成人免费看片app下载| 久久人人爽人人爽| 麻豆精品国产91久久久久久| 欧美三级中文字幕| 亚洲影院理伦片| 91一区一区三区| 国产精品无遮挡| 国产精品88av| 久久女同精品一区二区| 蜜臀精品一区二区三区在线观看 | 日韩三级在线免费观看| 亚洲sss视频在线视频| 色8久久精品久久久久久蜜| 亚洲欧洲精品成人久久奇米网| 国产一区999| 精品处破学生在线二十三| 免费三级欧美电影| 欧美一区二区三区视频在线观看 | 国产精品18久久久久久久网站| 欧美一区午夜视频在线观看| 亚洲风情在线资源站| 欧美亚洲动漫制服丝袜| 亚洲国产精品欧美一二99| 欧美丝袜丝交足nylons| 亚洲二区在线视频| 欧美午夜精品理论片a级按摩| 亚洲综合在线第一页| 欧美视频在线观看一区| 亚洲成人自拍偷拍| 91精品国产综合久久蜜臀| 日日摸夜夜添夜夜添亚洲女人| 91精品国产丝袜白色高跟鞋| 日韩不卡手机在线v区| 日韩欧美国产综合在线一区二区三区| 五月天亚洲婷婷| 精品美女一区二区三区| 国产成人99久久亚洲综合精品| 欧美高清在线一区| 97久久精品人人做人人爽50路| 亚洲欧美一区二区三区久本道91| 色婷婷狠狠综合| 日韩电影在线免费看| 欧美一二三区在线观看| 国产精品亚洲一区二区三区在线| 中文字幕制服丝袜一区二区三区 | 色婷婷激情一区二区三区| 亚洲一区在线电影| 欧美一区二区三区不卡| 国产精品123区| 亚洲一区中文日韩| 欧美精品一区二区三区很污很色的| 成人性视频网站| 水蜜桃久久夜色精品一区的特点| 欧美电视剧免费全集观看| av一区二区三区| 视频在线在亚洲| 欧美韩国日本一区| 在线播放中文字幕一区| 国产大陆亚洲精品国产| 亚洲国产精品视频| 欧美高清在线一区| 日韩欧美国产综合| 色综合av在线| 国产91精品欧美| 免费看日韩精品| 亚洲天天做日日做天天谢日日欢 | 高清免费成人av| 三级久久三级久久| 国产精品妹子av| 日韩你懂的在线播放| 一本色道久久综合狠狠躁的推荐| 免费观看在线色综合| 亚洲免费观看在线观看| 久久免费国产精品| 欧美一区二区女人| 欧美私模裸体表演在线观看| 成人高清av在线| 久久国产精品第一页| 亚洲视频电影在线| 2020国产精品自拍| 日韩亚洲欧美中文三级| 欧美在线观看视频一区二区| 成人av在线资源网站| 国产一区二区三区在线观看精品 | 午夜亚洲福利老司机| 国产精品国产三级国产普通话三级| 欧美tickle裸体挠脚心vk| 欧美日韩一区中文字幕| 972aa.com艺术欧美| 成人黄色一级视频| 懂色av中文字幕一区二区三区| 久久国产精品99久久人人澡| 五月天一区二区| 图片区小说区区亚洲影院| 一区二区三区在线免费观看| 国产精品色在线观看| 国产午夜精品一区二区三区四区| 欧美大片日本大片免费观看| 日韩视频免费观看高清完整版| 51精品久久久久久久蜜臀| 欧美在线观看视频在线| 欧美日韩中文精品| 欧美日韩一区二区不卡| 色婷婷av一区二区三区之一色屋| 日本福利一区二区| 欧美亚洲自拍偷拍| 欧美日韩国产一级二级| 91精品国产综合久久小美女| 欧美一区二区三区系列电影| 日韩欧美亚洲一区二区| 亚洲精品一区二区三区精华液| 久久影院视频免费| 欧美韩国日本不卡| 日韩伦理av电影| 亚洲一区二区中文在线| 天天操天天综合网| 麻豆91精品91久久久的内涵| 国产精品12区| 色婷婷激情一区二区三区| 欧美探花视频资源| 欧美大片免费久久精品三p| 久久久久久久国产精品影院| 成人免费一区二区三区在线观看| 一区二区三区四区不卡在线| 午夜精品久久久久久| 日本美女一区二区| 国产成人免费在线视频| 色综合咪咪久久| 91精品国产免费| 国产精品美女久久久久av爽李琼| 一区二区三区中文在线| 男男视频亚洲欧美| 成人黄色在线看| 欧美丰满一区二区免费视频| 精品国产乱码久久久久久久| 国产精品美女www爽爽爽| 亚洲一区在线视频观看| 狠狠色综合播放一区二区| 99久久国产免费看| 日韩欧美中文字幕公布| 国产精品免费av| 视频一区视频二区中文字幕| 国产盗摄一区二区| 欧美日韩高清一区二区不卡| 国产亚洲一本大道中文在线| 1000部国产精品成人观看| 男人操女人的视频在线观看欧美| www.激情成人| 欧美videofree性高清杂交| 亚洲免费av高清| 国产美女在线精品| 欧美区在线观看| 亚洲视频一区二区在线观看| 精品中文字幕一区二区小辣椒 | 亚洲免费观看高清| 国精产品一区一区三区mba桃花| 欧美在线免费视屏| 国产精品美女久久久久aⅴ| 久久精品国产999大香线蕉| 色综合天天天天做夜夜夜夜做| 日韩女优av电影在线观看| 国产精品久久久久久一区二区三区| 免费观看在线综合色| 欧美日韩视频第一区| 中文字幕第一区第二区| 国模一区二区三区白浆| 欧美日韩国产综合一区二区三区| 国产精品久久久久久久岛一牛影视 | 久久er精品视频| 欧美日韩免费在线视频| 亚洲欧美另类在线| jiyouzz国产精品久久| 久久一区二区三区国产精品| 日本网站在线观看一区二区三区| 欧美色视频在线| 伊人婷婷欧美激情| 97精品国产97久久久久久久久久久久| 精品国产1区二区| 精品一区在线看| 欧美大肚乱孕交hd孕妇| 七七婷婷婷婷精品国产| 欧美一区永久视频免费观看| 亚洲成人动漫精品| 欧美老肥妇做.爰bbww视频| 亚洲一区二区视频在线观看| 在线视频国产一区| 一区二区三区四区av| 欧美午夜精品理论片a级按摩| 亚洲自拍另类综合| 欧美日韩中文精品|