小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

單實(shí)例模式數(shù)據(jù)庫(kù)連接池+log4j

 kunge 2007-01-17

單實(shí)例模式數(shù)據(jù)庫(kù)連接池+log4j

//DBConnectionManager.java  連接池類

 
package cn.ifnic.db;
import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import cn.ifnic.util.Common;
import cn.ifnic.util.GetProperties;
/**
 *
 * <p>Title: IFNIC</p>
 *
 * <p>Description: 類DBConnectionManager,連接池的管理類</p>
 *
 * <p>Copyright: Copyright (c) 2005 www.</p>
 *
 * <p>Company: IFNIC.CN</p>
 *
 * @author IFNIC
 * @version 1.1.0
 */
/**
 * 管理類DBConnectionManager支持對(duì)一個(gè)或多個(gè)由屬性文件定義的數(shù)據(jù)庫(kù)連接
 * 池的訪問.客戶程序可以調(diào)用getInstance()方法訪問本類的唯一實(shí)例.
 */
public class DBConnectionManager {
    static private DBConnectionManager instance; // 唯一實(shí)例
    static private int clients;
    private Vector drivers = new Vector();
    private Logger logger;
    //private PrintWriter log;
    private Hashtable pools = new Hashtable();
    /**
     * 返回唯一實(shí)例.如果是第一次調(diào)用此方法,則創(chuàng)建實(shí)例
     *
     * @return DBConnectionManager 唯一實(shí)例
     */
    static synchronized public DBConnectionManager getInstance() {
        if (instance == null) {
            instance = new DBConnectionManager();
        }
        clients++;
        return instance;
    }
    /**
     * 建構(gòu)函數(shù)私有以防止其它對(duì)象創(chuàng)建本類實(shí)例
     */
    private DBConnectionManager() {
        init();
    }
    /**
     * 將連接對(duì)象返回給由名字指定的連接池
     *
     * @param name 在屬性文件中定義的連接池名字
     * @param con 連接對(duì)象
     */
    public void freeConnection(String name, Connection con) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
            pool.freeConnection(con);
        }
    }
    /**
     * 獲得一個(gè)可用的(空閑的)連接.如果沒有可用連接,且已有連接數(shù)小于最大連接數(shù)
     * 限制,則創(chuàng)建并返回新連接
     *
     * @param name 在屬性文件中定義的連接池名字
     * @return Connection 可用連接或null
     */
    public Connection getConnection(String name) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
            return pool.getConnection();
        }
        return null;
    }
    /**
     * 獲得一個(gè)可用連接.若沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制,
     * 則創(chuàng)建并返回新連接.否則,在指定的時(shí)間內(nèi)等待其它線程釋放連接.
     *
     * @param name 連接池名字
     * @param time 以毫秒計(jì)的等待時(shí)間
     * @return Connection 可用連接或null
     */
    public Connection getConnection(String name, long time) {
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null) {
            return pool.getConnection(time);
        }
        return null;
    }
    /**
     * 關(guān)閉所有連接,撤銷驅(qū)動(dòng)程序的注冊(cè)
     */
    public synchronized void release() {
        // 等待直到最后一個(gè)客戶程序調(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);
                logger.info("撤銷JDBC驅(qū)動(dòng)程序 " + driver.getClass().getName() + "的注冊(cè)");
            } catch (SQLException e) {
                logger.error("無法撤銷下列JDBC驅(qū)動(dòng)程序的注冊(cè): " + driver.getClass().getName(),
                             e.getNextException());
            }
        }
    }
    /**
     * 根據(jù)指定屬性創(chuàng)建連接池實(shí)例.
     *
     * @param props 連接池屬性
     */
    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) {
                    logger.error("沒有為連接池" + poolName + "指定URL");
                    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) {
                    logger.error("錯(cuò)誤的最大連接數(shù)限制: " + maxconn + " .連接池: " +
                                 poolName);
                    max = 0;
                }
                DBConnectionPool pool =
                        new DBConnectionPool(poolName, url, user, password, max);
                pools.put(poolName, pool);
                logger.info("成功創(chuàng)建連接池" + poolName);
            }
        }
    }
    /**
     * 讀取屬性完成初始化
     */
    private void init() {
        GetProperties getProperties = new GetProperties();
        if (getProperties.getProperties("DBConnectionManager") != null) {
            PropertyConfigurator.configure(getProperties.getProperties(
                    "DBConnectionManager"));
        }
        logger = Logger.getLogger(Common.class.getName());
        if (getProperties.getProperties("db") != null) {
            Properties pp=getProperties.getProperties("db");
            loadDrivers(pp);
            createPools(pp);
        } else {
            return;
        }
    }
    /**
     * 裝載和注冊(cè)所有JDBC驅(qū)動(dòng)程序
     *
     * @param props 屬性
     */
    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);
                logger.info("成功注冊(cè)JDBC驅(qū)動(dòng)程序" + driverClassName);
            } catch (Exception e) {
                logger.error("無法注冊(cè)JDBC驅(qū)動(dòng)程序: " +
                             driverClassName + ", 錯(cuò)誤: " + e);
            }
        }
    }
 
    /**
     * 此內(nèi)部類定義了一個(gè)連接池.它能夠根據(jù)要求創(chuàng)建新連接,直到預(yù)定的最
     * 大連接數(shù)為止.在返回連接給客戶程序之前,它能夠驗(yàn)證連接的有效性.
     */
    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;
        private Logger logger;
        /**
         * 創(chuàng)建新的連接池
         *
         * @param name 連接池名字
         * @param URL 數(shù)據(jù)庫(kù)的JDBC URL
         * @param user 數(shù)據(jù)庫(kù)賬號(hào),或 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;
            GetProperties getProperties = new GetProperties();
            if (getProperties.getProperties("DBConnectionManager") != null) {
                PropertyConfigurator.configure(getProperties.getProperties(
                        "DBConnectionManager"));
                logger = Logger.getLogger(Common.class.getName());
            } else {
                return;
            }
        }
        /**
         * 將不再使用的連接返回給連接池
         *
         * @param con 客戶程序釋放的連接
         */
        public synchronized void freeConnection(Connection con) {
            // 將指定連接加入到向量末尾
            freeConnections.addElement(con);
            checkedOut--;
            notifyAll();
        }
        /**
         * 從連接池獲得一個(gè)可用連接.如沒有空閑的連接且當(dāng)前連接數(shù)小于最大連接
         * 數(shù)限制,則創(chuàng)建新連接.如原來登記為可用的連接不再有效,則從向量刪除之,
         * 然后遞歸調(diào)用自己以嘗試新的可用連接.
         */
        public synchronized Connection getConnection() {
            Connection con = null;
            if (freeConnections.size() > 0) {
                // 獲取向量中第一個(gè)可用連接
                con = (Connection) freeConnections.firstElement();
                freeConnections.removeElementAt(0);
                try {
                    if (con.isClosed()) {
                        logger.info("從連接池" + name + "刪除一個(gè)無效連接");
                        // 遞歸調(diào)用自己,嘗試再次獲取可用連接
                        con = getConnection();
                    }
                } catch (SQLException e) {
                    logger.warn("從連接池" + name + "刪除一個(gè)無效連接");
                    // 遞歸調(diào)用自己,嘗試再次獲取可用連接
                    con = getConnection();
                }
            } else if (maxConn == 0 || checkedOut < maxConn) {
                con = newConnection();
            }
            if (con != null) {
                checkedOut++;
            }
            return con;
        }
        /**
         * 從連接池獲取可用連接.可以指定客戶程序能夠等待的最長(zhǎng)時(shí)間
         * 參見前一個(gè)getConnection()方法.
         *
         * @param timeout 以毫秒計(jì)的等待時(shí)間限制
         */
        public synchronized Connection getConnection(long timeout) {
            long startTime = new Date().getTime();
            Connection con;
            while ((con = getConnection()) == null) {
                try {
                    wait(timeout);
                } catch (InterruptedException e) {}
                if ((new Date().getTime() - startTime) >= timeout) {
                    // wait()返回的原因是超時(shí)
                    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();
                    logger.info("關(guān)閉連接池" + name + "中的一個(gè)連接");
                } catch (SQLException e) {
                    logger.error("無法關(guān)閉連接池" + name + "中的連接", e.getNextException());
                }
            }
            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);
                }
                logger.info("連接池" + name + "創(chuàng)建一個(gè)新的連接");
            } catch (SQLException e) {
                logger.error("無法創(chuàng)建下列URL的連接: " + URL, e.getNextException());
                return null;
            }
            return con;
        }
    }
}
 

 
//PropertiesLoader.java 配置文件讀取類
 
package cn.ifnic.util;
import java.util.Properties;
import java.io.InputStream;
import java.io.*;
/**
 *
 * <p>Title: IFNIC</p>
 *
 * <p>Description: 類GetProperties,用來獲取*.properties配置文件的</p>
 *
 * <p>Copyright: Copyright (c) 2005 www.</p>
 *
 * <p>Company: IFNIC.CN</p>
 *
 * @author IFNIC
 * @version 1.1.0
 */

public class PropertiesLoader {
    /**
     * 用法:getProperties(*.properties配置文件名),返回一個(gè)Properties對(duì)象
     * @param propertiesName String
     * @return Properties
     */
    public Properties getProperties(String propertiesName) {
        InputStream is = getClass().getResourceAsStream("/" + propertiesName +
                ".properties");
        Properties dbProps = new Properties();
        try {
            dbProps.load(is);
            return dbProps;
        } catch (IOException ex) {
            System.out.println("不能讀取屬性文件. " +
                               "請(qǐng)確保" + propertiesName +
                               ".properties 在CLASSPATH指定的路徑中");
            return null;
        }
    }
}

 

//db.properties 連接池配置文件

 

drivers=net.sourceforge.jtds.jdbc.Driver #為連接池指定一個(gè)數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)程序

jtds_root.url=jdbc:jtds:sqlserver://localhost/root #數(shù)據(jù)庫(kù)連接URL
jtds_root.maxconn=0 #連接最大數(shù) 為0表示沒有限制
jtds_root.user=sa #數(shù)據(jù)庫(kù)用戶名
jtds_root.password=sa #數(shù)據(jù)庫(kù)密碼

//DBConnectionManager.properties Log4j配置文件

log4j.rootLogger=INFO, Common #定義被日志捕獲的信息級(jí)別
#ERROR、WARN、INFO、DEBUG
log4j.appender.Common=org.apache.log4j.RollingFileAppender #定義日志的存儲(chǔ)方式
log4j.appender.Common.File = logs/DBConnectionManagerLog.html #定義日志文件路徑
log4j.appender.Common.Append=true #定義是否追加 否為覆蓋
log4j.appender.Common.MaxFileSize = 1024kb #定義文件大小
log4j.appender.Common.MaxBackupIndex=10 #定義最大備份文件數(shù)log4j.appender.Common.layout=org.apache.log4j.HTMLLayout #定義輸出格式為HTML格式

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多