<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)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 最新亚洲精品国偷自产在线| 羞羞漫画小舞被黄漫免费| 久久久久久精品免费看SSS| 亚洲大尺码专区影院| 黄页网站在线观看免费高清| 亚洲heyzo专区无码综合| 亚洲一区二区三区影院| 日本免费一区二区在线观看| 国产天堂亚洲国产碰碰| 久久亚洲成a人片| 免费看的一级毛片| 美女黄频a美女大全免费皮| 久久精品国产亚洲夜色AV网站| 日本免费一区二区在线观看| 免费看一级高潮毛片| 亚洲人成在线播放网站岛国| 男女啪啪永久免费观看网站| 国产一精品一AV一免费| 亚洲精品国产首次亮相| 亚洲va久久久噜噜噜久久男同| 毛片a级三毛片免费播放| 国产免费一区二区三区在线观看| 一本色道久久综合亚洲精品蜜桃冫| 成人亚洲性情网站WWW在线观看| 又粗又大又黑又长的免费视频| 一个人看的www在线免费视频 | 亚洲中文字幕无码中文字在线| 天天影院成人免费观看| 国产精品无码永久免费888| 亚洲国产成人久久三区| 亚洲国产另类久久久精品黑人| 日本免费无遮挡吸乳视频电影| 久久久久久一品道精品免费看| 美女被免费网站视频在线| 亚洲视频一区在线观看| 久久精品国产亚洲一区二区三区 | 成人免费毛片内射美女APP| 丁香花在线视频观看免费| 一级毛片在线播放免费| 亚洲色成人四虎在线观看| 亚洲美女人黄网成人女|