<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

    一個很不錯的數(shù)據(jù)庫連接池實(shí)現(xiàn),備份之

    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() {
        // 等待直到最后一個客戶程序調(diào)用
        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驅(qū)動程序 " + driver.getClass().getName()+"的注冊");
          }
          catch (SQLException e) {
          log(e, "無法撤銷下列JDBC驅(qū)動程序的注冊: " + 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;

        /**
        * 創(chuàng)建新的連接池
        *
        * @param name 連接池名字
        * @param URL 數(shù)據(jù)庫的JDBC URL
        * @param user 數(shù)據(jù)庫帳號,或 null
        * @param password 密碼,或 null
        * @param maxConn 此連接池允許建立的最大連接數(shù)
        */
        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();
        }

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

      /**
      * 從連接池獲取可用連接.可以指定客戶程序能夠等待的最長時間
      * 參見前一個getConnection()方法.
      *
      * @param timeout 以毫秒計(jì)的等待時間限制
      */
        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;
        }

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久亚洲AV成人无码| 久久久久久久久亚洲| 成年性羞羞视频免费观看无限| 华人在线精品免费观看| 国产高潮久久免费观看| 无码日韩人妻AV一区免费l| 亚洲av永久无码精品古装片| 亚洲精品国产自在久久| 免费观看AV片在线播放| 日韩人妻无码精品久久免费一| 亚洲精品中文字幕| 亚洲一区二区三区国产精华液| 亚洲日韩国产成网在线观看| 国产美女无遮挡免费网站| 国产真人无码作爱免费视频| 国产成人无码免费网站| 日韩精品无码免费专区午夜| 亚洲熟妇AV一区二区三区宅男| 亚洲AV无码精品蜜桃| 国产亚洲成av人片在线观看| 亚洲毛片不卡av在线播放一区| 亚洲爽爽一区二区三区| 国产亚洲精品成人a v小说| 亚洲欧洲国产精品香蕉网| 日本一道在线日本一道高清不卡免费| 毛片免费观看的视频在线| 免费无遮挡无码视频网站| 97国产在线公开免费观看| 永久免费精品影视网站| 亚洲黄片手机免费观看| 99久久99这里只有免费的精品| 三年片在线观看免费| 中文字幕免费高清视频| 成年午夜视频免费观看视频| 国产片免费在线观看| 精品国产亚洲男女在线线电影| 国产亚洲精品自在久久| 亚洲精品偷拍无码不卡av| 亚洲中文字幕无码爆乳| 好吊色永久免费视频大全| 猫咪免费观看人成网站在线|