<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 189,comments - 115,trackbacks - 0

    一個很不錯的數據庫連接池實現,備份之

    import java.sql.*;
    import java.io.*;
    import java.util.*;
    public class DBConnectionManager {

      private static int clients = 0;
      private static DBConnectionManager instance;
      private Vector drivers = new Vector();
      private PrintWriter log;
      private Hashtable pools = new Hashtable();


      public DBConnectionManager() {
        init();
      }
      private void log(String msg) {
        log.println(new java.util.Date() + ": " + msg);
      }

      /**
      * 將文本信息與異常寫入日志文件
      */
      private void log(Throwable e, String msg) {
        log.println(new java.util.Date() + ": " + msg);
        e.printStackTrace(log);
      }

      public static synchronized  DBConnectionManager getInstance() {
        if (instance == null) {
          instance = new DBConnectionManager();
        }
        clients++;
        return instance;
      }
      private void init() {
        InputStream is = getClass().getResourceAsStream("/db.properties");
        Properties dbProps = new Properties();
        try {
          dbProps.load(is);
        }
        catch (Exception e) {
            System.err.println("Can not read the properties file. " +
            "Make sure db.properties is in the CLASSPATH");
            return;
        }
        loadDrivers(dbProps);
        createPools(dbProps);
      }
      public void freeConnection(String name, Connection con) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
          pool.freeConnection(con);
        }
      }
      public Connection getConnection(String name) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
          return pool.getConnection();
        }
        return null;
      }
      public Connection getConnection(String name, long time) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
          return pool.getConnection(time);
        }
        return null;
      }
      public synchronized void release() {
        // 等待直到最后一個客戶程序調用
        if (--clients != 0)
        {
          return;
        }
        Enumeration allPools = pools.elements();
        while (allPools.hasMoreElements())
        {
          DBConnectionPool pool = (DBConnectionPool)allPools.nextElement();
          pool.release();
        }
        Enumeration allDrivers = drivers.elements();
        while (allDrivers.hasMoreElements())
        {
          Driver driver = (Driver) allDrivers.nextElement();
          try {
            DriverManager.deregisterDriver(driver);
            log("撤銷JDBC驅動程序 " + driver.getClass().getName()+"的注冊");
          }
          catch (SQLException e) {
          log(e, "無法撤銷下列JDBC驅動程序的注冊: " + driver.getClass().getName());
          }
        }
      }


    /*
    drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver

    logfile=D:\\user\\src\\java\\DBConnectionManager\\log.txt

    idb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prp

    idb.maxconn=2

    access.url=jdbc:odbc:demo

    access.user=demo

    access.password=demopw

    */
      private void loadDrivers(Properties props) {
        String driverClasses = props.getProperty("drivers");
        StringTokenizer st = new StringTokenizer(driverClasses);
        while (st.hasMoreElements()) {
          String driverClassName = st.nextToken().trim();
          try {
            Driver driver = (Driver)
              Class.forName(driverClassName).newInstance();
            DriverManager.registerDriver(driver);
            drivers.addElement(driver);
         //   Log.log("Registered JDBC driver " + driverClassName);
          }
          catch (Exception e) {
          //  Log.log("Can not register JDBC driver: " + driverClassName + ", Exception: " + e.toString()));
          }
        }
      }
      private void createPools(Properties props) {
        Enumeration propNames = props.propertyNames();
        while (propNames.hasMoreElements())
        {
          String name = (String) propNames.nextElement();
          if (name.endsWith(".url"))
          {
            String poolName = name.substring(0, name.lastIndexOf("."));
            String url = props.getProperty(poolName + ".url");
            if (url == null) {
           //   Log.log("No URL specified for " + poolName);
              continue;
            }
            String user = props.getProperty(poolName + ".user");
            String password = props.getProperty(poolName + ".password");
            String maxconn = props.getProperty(poolName + ".maxconn", "0");
            int max;
            try {
              max = Integer.valueOf(maxconn).intValue();
            }
            catch (NumberFormatException e) {
          //    Log.log("Invalid maxconn value " + maxconn + " for " +   poolName);
              max = 0;
            }
            DBConnectionPool pool =
              new DBConnectionPool(poolName, url, user, password, max);
            pools.put(poolName, pool);
          //  Log.log("Initialized pool " + poolName);
          }
        }
      }

      class DBConnectionPool {
        private int checkedOut;
        private Vector freeConnections = new Vector();
        private int maxConn;
        private String name;
        private String password;
        private String URL;
        private String user;

        /**
        * 創建新的連接池
        *
        * @param name 連接池名字
        * @param URL 數據庫的JDBC URL
        * @param user 數據庫帳號,或 null
        * @param password 密碼,或 null
        * @param maxConn 此連接池允許建立的最大連接數
        */
        public DBConnectionPool(String name, String URL, String user
            , String password,   int maxConn)
        {
          this.name = name;
          this.URL = URL;
          this.user = user;
          this.password = password;
          this.maxConn = maxConn;
        }

      /**
      * 將不再使用的連接返回給連接池
      *
      * @param con 客戶程序釋放的連接
      */
        public synchronized void freeConnection(Connection con) {
        // 將指定連接加入到向量末尾
          freeConnections.addElement(con);
          checkedOut--;
          notifyAll();
        }

        /**
         * 從連接池獲得一個可用連接.如沒有空閑的連接且當前連接數小于最大連接
         * 數限制,則創建新連接.如原來登記為可用的連接不再有效,則從向量刪除之,
         * 然后遞歸調用自己以嘗試新的可用連接.
         */
        public synchronized Connection getConnection()
        {
          Connection con = null;
          if (freeConnections.size() > 0)
          {
          // 獲取向量中第一個可用連接
            con = (Connection) freeConnections.firstElement();
            freeConnections.removeElementAt(0);
            try {
              if (con.isClosed())
              {
                log("從連接池" + name+"刪除一個無效連接");
                // 遞歸調用自己,嘗試再次獲取可用連接
                con = getConnection();
              }
            }
            catch (SQLException e)
            {
              log("從連接池" + name+"刪除一個無效連接");
              // 遞歸調用自己,嘗試再次獲取可用連接
              con = getConnection();
            }
          }
          else if (maxConn == 0 || checkedOut < maxConn)
          {
            con = newConnection();
          }
          if (con != null) {
            checkedOut++;
          }
          return con;
        }

      /**
      * 從連接池獲取可用連接.可以指定客戶程序能夠等待的最長時間
      * 參見前一個getConnection()方法.
      *
      * @param timeout 以毫秒計的等待時間限制
      */
        public synchronized Connection getConnection(long timeout)
        {
          long startTime = new java.util.Date().getTime();
          Connection con;
          while ((con = getConnection()) == null)
          {
            try {
              wait(timeout);
            }
            catch (InterruptedException e) {}
            if ((new java.util.Date().getTime() - startTime) >= timeout)
            {
            // wait()返回的原因是超時
              return null;
            }
          }
          return con;
        }

      /**
      * 關閉所有連接
      */
        public synchronized void release()
        {
          Enumeration allConnections = freeConnections.elements();
          while (allConnections.hasMoreElements())
          {
            Connection con = (Connection) allConnections.nextElement();
            try {
            con.close();
              log("關閉連接池" + name+"中的一個連接");
            }
            catch (SQLException e) {
              log(e, "無法關閉連接池" + name+"中的連接");
            }
          }
          freeConnections.removeAllElements();
        }

      /**
      * 創建新的連接
      */
        private Connection newConnection()
        {
          Connection con = null;
          try {
            if (user == null) {
              con = DriverManager.getConnection(URL);
            }
            else {
              con = DriverManager.getConnection(URL, user, password);
            }
            log("連接池" + name+"創建一個新的連接");
          }
          catch (SQLException e) {
            log(e, "無法創建下列URL的連接: " + URL);
            return null;
          }
          return con;
        }
      }
    }

    posted on 2006-03-16 10:42 MEYE 閱讀(367) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲av无码潮喷在线观看| 国产偷国产偷亚洲清高APP| 最近免费中文字幕视频高清在线看| 亚洲色成人WWW永久在线观看 | 国产AV无码专区亚洲AV漫画| 亚洲国产成+人+综合| 四虎影视精品永久免费网站| 中国极品美軳免费观看| 亚洲人成网7777777国产| 91在线免费观看| 亚洲v高清理论电影| 浮力影院第一页小视频国产在线观看免费 | 黄色网址免费大全| 日韩亚洲人成网站| 亚洲国产成人久久精品动漫| 国产精品无码素人福利免费| 久久免费观看国产精品88av| 亚洲综合无码一区二区三区| 全亚洲最新黄色特级网站 | 日日狠狠久久偷偷色综合免费| 亚洲精选在线观看| www国产亚洲精品久久久日本| 在线观看免费av网站| 亚洲性线免费观看视频成熟| 亚洲啪啪AV无码片| 日韩高清免费观看| 一级一级一片免费高清| 亚洲一区无码中文字幕乱码| 久久亚洲精品视频| 亚洲成a人在线看天堂无码| 特级做A爰片毛片免费看无码 | 亚洲AV成人片色在线观看高潮| 国产一区二区三区免费视频 | 亚洲专区先锋影音| 亚洲日韩人妻第一页| 青青青国产免费一夜七次郎| 在线观看免费播放av片| 亚洲国产精品成人久久久| 亚洲va中文字幕无码久久| 亚洲性久久久影院| 国产伦一区二区三区免费|