亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产一区不卡在线| 99久久国产免费看| 亚洲日穴在线视频| 26uuu国产在线精品一区二区| 99久久精品免费看国产| 麻豆一区二区在线| 亚洲高清久久久| 国产精品久久免费看| www欧美成人18+| 3d成人h动漫网站入口| 91蝌蚪porny九色| 国产一区二区免费视频| 日本美女一区二区| 亚洲精品免费在线播放| 国产欧美在线观看一区| 日韩精品中午字幕| 欧美一区二区啪啪| 欧美美女喷水视频| 欧美日韩精品系列| 色婷婷av一区二区三区软件| 成人在线综合网站| 国产九九视频一区二区三区| 日本欧美韩国一区三区| 亚洲777理论| 亚洲已满18点击进入久久| 亚洲欧洲日产国产综合网| 国产精品中文字幕一区二区三区| 欧美日本一区二区三区| 狠狠色综合色综合网络| 亚洲午夜私人影院| 亚洲人成小说网站色在线| 精品三级在线观看| 欧美一个色资源| 欧美日韩你懂得| 91精品欧美综合在线观看最新| 午夜影院在线观看欧美| 欧美日韩黄色影视| 欧洲日韩一区二区三区| 色综合中文综合网| 国产精品人人做人人爽人人添| 337p粉嫩大胆噜噜噜噜噜91av| 欧美一区二区成人| 欧美区在线观看| 这里只有精品免费| 欧美成人a在线| 精品国产一二三区| 国产亚洲污的网站| 国产视频一区二区在线观看| 国产偷国产偷精品高清尤物| 久久精品这里都是精品| 国产欧美久久久精品影院| 国产精品成人午夜| 亚洲国产综合在线| 日本系列欧美系列| 国产精品乡下勾搭老头1| www.欧美.com| 欧美午夜精品理论片a级按摩| 欧美高清视频一二三区| 欧美成人精精品一区二区频| 久久精品夜夜夜夜久久| 自拍视频在线观看一区二区| 一二三四社区欧美黄| 日韩精品五月天| 国产一区二区伦理片| 91在线视频播放| 欧美久久久久久蜜桃| 精品国产乱码久久久久久蜜臀| 久久夜色精品国产欧美乱极品| 中文字幕高清一区| 亚洲国产婷婷综合在线精品| 免费成人在线影院| 粉嫩嫩av羞羞动漫久久久 | 日韩中文字幕1| 国产一区二区调教| 91在线无精精品入口| 欧美日本韩国一区二区三区视频| 欧美大肚乱孕交hd孕妇| 欧美国产精品劲爆| 亚洲va韩国va欧美va精品| 国产一区二区三区香蕉| 色av一区二区| 2020国产精品自拍| 亚洲一区二区三区在线看| 国产一区久久久| 欧美日韩高清影院| 久久精品一二三| 亚洲成年人网站在线观看| 国产乱人伦偷精品视频不卡| 欧洲av在线精品| 国产色爱av资源综合区| 天天av天天翘天天综合网| 高清在线成人网| 日韩欧美视频在线| 亚洲日本成人在线观看| 精久久久久久久久久久| 欧美色爱综合网| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美色涩在线第一页| 日本一区二区三区久久久久久久久不 | 国产精品乱码人人做人人爱| 日韩中文字幕区一区有砖一区 | 26uuu亚洲综合色欧美| 亚洲午夜三级在线| 成人黄色777网| 精品99久久久久久| 日韩影院免费视频| 欧美在线观看你懂的| 国产精品久久久久影院老司| 美国欧美日韩国产在线播放| 欧美日韩在线观看一区二区| 最新不卡av在线| 懂色av噜噜一区二区三区av| 2023国产精品自拍| 久久国产综合精品| 91精品久久久久久蜜臀| 午夜精品一区在线观看| 色网站国产精品| 日韩理论片网站| 99热在这里有精品免费| 国产欧美日韩精品a在线观看| 九九精品一区二区| 欧美一级在线观看| 美国av一区二区| 日韩精品专区在线| 久久超级碰视频| 91精品国产91久久综合桃花| 亚洲电影一级黄| 欧美日韩国产高清一区二区三区| 亚洲一区二区欧美| 欧美日韩一区二区在线视频| 亚洲一区二区三区四区中文字幕| 一本一道波多野结衣一区二区| ㊣最新国产の精品bt伙计久久| 99综合电影在线视频| 国产精品久久久久久户外露出| 成人综合婷婷国产精品久久蜜臀| 中文字幕va一区二区三区| 岛国av在线一区| 中文字幕在线视频一区| 91视频国产观看| 亚洲一区在线视频| 欧美久久婷婷综合色| 青娱乐精品在线视频| 久久综合久久综合亚洲| 粉嫩av亚洲一区二区图片| 一区免费观看视频| 91国内精品野花午夜精品| 亚洲成人一二三| 日韩三级中文字幕| 国产91在线观看| 亚洲另类中文字| 欧美日韩高清一区| 激情欧美一区二区三区在线观看| 久久综合九色综合欧美98| 国产69精品一区二区亚洲孕妇| 国产精品久久久久影院亚瑟| 91精品办公室少妇高潮对白| 午夜精品一区二区三区三上悠亚| 日韩欧美国产一区二区在线播放| 亚洲自拍偷拍综合| 国产999精品久久久久久绿帽| 成人深夜在线观看| wwwwxxxxx欧美| 国产专区欧美精品| 中文字幕亚洲在| 欧美日韩国产三级| 国产乱码字幕精品高清av| 亚洲欧美日韩国产手机在线| 欧美日韩精品三区| 国产精品91一区二区| 一区二区三区在线观看欧美| 日韩一级高清毛片| jlzzjlzz欧美大全| 肉色丝袜一区二区| 亚洲国产精品精华液ab| 欧美日韩免费观看一区二区三区 | 日韩—二三区免费观看av| 久久综合久久99| 在线精品视频一区二区三四 | 国产成人av电影在线| 一区二区三区欧美日韩| 久久夜色精品国产欧美乱极品| 色播五月激情综合网| 国产乱码精品一区二区三区五月婷| 亚洲蜜桃精久久久久久久| 日韩欧美另类在线| 91免费版pro下载短视频| 久久成人免费网站| 一区二区国产盗摄色噜噜| 久久亚洲欧美国产精品乐播 | 日本电影亚洲天堂一区| 蜜乳av一区二区三区| 亚洲精品乱码久久久久久久久| 欧美v日韩v国产v| 色国产精品一区在线观看| 国产精品亚洲午夜一区二区三区| 亚洲第一主播视频| 亚洲美女视频一区| 国产亚洲综合在线| 欧美岛国在线观看|