⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbconnectionmanager.java

📁 基于Java的地图数据管理软件。使用MySQL数据库管理系统。
💻 JAVA
字号:
package com.tongtu.comm.sql;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;

/**
 * JDBC数据库连接管理类。<p>
 *
 * @author irevin
 * @version 1.0
 */
public class DBConnectionManager{
    //静态实例,Singleton
    private static DBConnectionManager instance;
    //数据库连接池
    //private DBConnectionPool pool;
    //取静态实例的次数
    private static int clients;
    //JDBC驱动集
    private Vector drivers = new Vector();
    //连接池集
    private Hashtable pools;

    //日志,暂时不加
    //private final static Logger log = Logger.getInstance("DBConnectionManager");

    /**
     * 构造方法。
     */
    private DBConnectionManager(){
        //调用初始化方法
        init();
    }

    /**
     * 取实例。
     *
     * @return DBConnectionManager的唯一实例
     */
    public static synchronized DBConnectionManager getInstance(){
        if(null == instance){
            //如果实例为空,则新建之
            instance = new DBConnectionManager();
        }
        clients++;
        //-=----------------------
        //log.debug("dbm numbers: " + clients);
        //返回静态实例
        return instance;
    }

    /**
     * 取数据库连接。
     *
     * @param poolName 连接池名
     * @return 数据库连接或null
     * @throws SQLException SQL异常
     */
    public Connection getConnection(final String poolName)
            throws SQLException{
        //从连接池集中取给定名字的连接池;
        final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
        if(null != pool){
            //如果该连接池不为null,则从该池中取一个数据库连接并返回
            return pool.getConnection();
        }
        //否则返回null
        return null;
    }//end getConncetion()

    /**
     * 取数据库连接。
     *
     * @param poolName 连接池名
     * @param timeOut 等待时限(毫秒)
     * @return 数据库连接或null
     * @throws SQLException SQL异常
     */
    public Connection getConnection(final String poolName,final long timeOut)
            throws SQLException{
        //从连接池集中取给定名字的连接池
        final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
        if(null != pool){
            //如果该连接池不为null,则从该池中取一个数据库连接并返回
            return pool.getConnection(timeOut);
        }
        //否则返回null
        return null;
    }//end getConncetion()

    /**
     * 将数据库连接对象返回指定名字的数据库连接池中。
     *
     * @param conn 数据库连接
     * @param poolName 数据库连接池名
     * throws SQLException SQL异常
     */
    public void freeConnection(final Connection conn,final String poolName){
        //从连接池集中取给定名字的连接池
        final DBConnectionPool pool = (DBConnectionPool) pools.get(poolName);
        if(null != pool){
            //将给定连接返回连接池
            pool.freeConnection(conn);
            this.clients--;
        }
    }//end freeConncetion()

    /**
     * 初始化。
     */
    private void init(){
        //配置类
        final Configuration cfg = Configuration.getInstance();
        final Properties prop = cfg.getPorperties();
        final String strDrivers = cfg.getValue("DRIVERS");
        //装载并注册JDBC驱动
        loadDrivers(strDrivers);
        //创建连接池
        createPools(prop);
        //预建连接
        /*try{
            getConnection("DB");
        } catch(SQLException e){
            log.debug(e.getMessage());
        }*/
    }//end init()

    /**
     * 装载和注册所有的JDBC驱动。
     *
     * @param Drivers JDBC驱动名字串
     */
    private void loadDrivers(final String Drivers){
        //驱动集合
        //String driverClasses = Drivers;
        //按空格区分
        final StringTokenizer st = new StringTokenizer(Drivers);
        //注册和装载每个驱动
        while(st.hasMoreElements()){
            //驱动名
            final String driverClassName = st.nextToken().trim();
            try{
                //装载
                final Driver driver = (Driver) Class.forName(driverClassName).newInstance();
                //注册
                DriverManager.registerDriver(driver);
                //标记
                this.drivers.addElement(driver);
                //log
                //log.info("Driver Registed...");
            } catch(Exception e){
                //log...
                //log.error("loadDrivers error: " + e.getMessage());
            }//end try...catch...
        }//end while
    }//end loadDrivers()

    /**
     * 创建连接池。
     *
     * @param prop 属性对象
     */
    private void createPools(final Properties prop){
        pools = new Hashtable();
        //属性名
        final Enumeration propNames = prop.propertyNames();
        //循环创建每个连接池
        while(propNames.hasMoreElements()){
            //属性名
            final String name = (String) propNames.nextElement();
            //如果是.URL结尾,即是连接属性时
            if(name.endsWith(".URL")){
                //连接池名
                final String poolName = name.substring(0, name.lastIndexOf("."));
                //连接URL
                final String strURL = prop.getProperty(poolName + ".URL");
                if(null == strURL){
                    //如果URL为null,则执行下一循环
                    //log("没有为连接池" + poolName + "指定URL");
                    continue;
                }//end if...strURL = null?
                //用户名
                final String strUser = prop.getProperty(poolName + ".USER");
                //密码
                final String strPassword = prop.getProperty(poolName + ".PASSWORD");
                //最大连接数,无则为0
                final String strMaxConn = prop.getProperty(poolName + ".MAX_CONNECTIONS", "0");
                int maxConn;
                try{
                    //转成int
                    maxConn = Integer.valueOf(strMaxConn).intValue();
                } catch(NumberFormatException e){
                    //有异常,则设置最大连接数为0
                    //TODO:?IS SET TO DEFAULT
                    //log("错误的最大连接数限制: " + maxConn + " .连接池: " + poolName);
                    //log.error("createPools error: " + e.getMessage());
                    maxConn = 0;
                }//end try...catch...
                //创建连接池
                final DBConnectionPool pool = new DBConnectionPool(poolName, strURL, strUser, strPassword, maxConn);
                //
                //log.info("Pool\"" + poolName + "\" created...");
                try{
                    //登记
                    this.pools.put(poolName, pool);
                } catch(Exception e){
                    //log.error("createPools add pool error: " + e.getMessage());
                }
            }//end if
        }//end while
    }//end createPools()

    /**
     * 释放资源。
     */
    public synchronized void release(){
        //如果有客户程序在使用,则返回
        //todo:this.clients--;
        if(--this.clients != 0){
            //log.debug("clients : " + clients);
            return;
        }
        //所有连接池
        final Enumeration allPools = this.pools.elements();
        //循环释放每个连接池
        while(allPools.hasMoreElements()){
            //连接池
            final DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
            //释放
            pool.release();
            //log.info("Pools release...");
        }//end while
        //所有登记的驱动
        Enumeration allDrivers = this.drivers.elements();
        //循环注销登记的驱动
        while(allDrivers.hasMoreElements()){
            //驱动
            Driver driver = (Driver) allDrivers.nextElement();
            try{
                //注销
                DriverManager.deregisterDriver(driver);
                //log.info("Drivers deregisted...");
            } catch(Exception e){
                //log.error("release error: " + e.getMessage());
            }//end try...catch...
        }//end while
    }//end release()
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -