<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免费观看性色 | 亚洲人成免费电影| 9420免费高清在线视频| 亚洲国产成人久久77| 91黑丝国产线观看免费| 老色鬼久久亚洲AV综合| 国产成人精品免费视| 亚洲精品天堂在线观看| 国产jizzjizz免费视频| 国产精品永久免费视频| 国产亚洲免费的视频看| 少妇无码一区二区三区免费| 亚洲网址在线观看你懂的| 最近免费中文字幕高清大全 | 免费国产黄网站在线观看可以下载 | 精品亚洲一区二区三区在线观看| 皇色在线免费视频| 亚洲国产成人片在线观看无码| 午夜免费福利视频| 亚洲av永久综合在线观看尤物| 免费鲁丝片一级观看| 特色特黄a毛片高清免费观看| 亚洲人色婷婷成人网站在线观看 | 亚洲精品亚洲人成在线麻豆| 毛片免费全部免费观看| 国产亚洲精品美女久久久久| 国产亚洲精品高清在线| 精品国产污污免费网站aⅴ| 亚洲欧美第一成人网站7777| 久久综合亚洲色HEZYO国产| 91香焦国产线观看看免费| 亚洲成a人无码亚洲成av无码| 在线亚洲人成电影网站色www| 91精品国产免费入口| 污视频网站免费观看| 亚洲最大成人网色| 国产精品99久久免费| 免费日本一区二区| 色五月五月丁香亚洲综合网| 亚洲av激情无码专区在线播放|