<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-25 20:28 MEYE 閱讀(344) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 国产精品极品美女自在线观看免费 | 国产精品亚洲一区二区麻豆| 最近中文字幕2019高清免费| 亚洲视频2020| 亚洲人成在线免费观看| 亚洲人成小说网站色| 成人黄软件网18免费下载成人黄18免费视频| 亚洲色图综合网站| 国产免费看JIZZ视频| 亚洲精品无码永久在线观看男男| 影音先锋在线免费观看| 特级av毛片免费观看| 国产亚洲精品精品国产亚洲综合| 中文字幕永久免费| 67pao强力打造67194在线午夜亚洲| 99久久久国产精品免费牛牛 | 亚洲精品成人无限看| 免费无码作爱视频| 亚洲嫩草影院久久精品| 9久9久女女免费精品视频在线观看| 色噜噜亚洲男人的天堂| 亚洲av无码国产精品色在线看不卡 | 国产免费无遮挡精品视频| eeuss草民免费| 亚洲另类激情综合偷自拍| 在线jlzzjlzz免费播放| 一二三四在线观看免费中文在线观看 | **aaaaa毛片免费| 亚洲精品国产第一综合99久久| 亚洲精品第一国产综合精品99| 成人无码视频97免费| 亚洲免费黄色网址| vvvv99日韩精品亚洲| 99免费在线观看视频| 国产精品亚洲一区二区三区久久| 亚洲色婷婷一区二区三区| 青苹果乐园免费高清在线| 亚洲免费一区二区| 国产成人精品亚洲2020| 亚洲线精品一区二区三区影音先锋| 国产精品永久免费10000|