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

📄 dbconnectionmanager.java

📁 数据库连接包括连接池。很有用的资料
💻 JAVA
字号:
import java.io.*;import java.sql.*;import java.util.*;import java.util.Date;public class DBConnectionManager {    static private DBConnectionManager instance;       // The single instance    private Vector drivers = new Vector();    private PrintWriter log;    private Hashtable pools = new Hashtable();    private Hashtable clients = new Hashtable();    /**     * A private constructor since this is a Singleton     */    private DBConnectionManager()    throws SQLException {        init();    }    /**     * Returns the single instance, creating one if it's the     * first time this method is called.     *     * @return DBConnectionManager The single instance.     */    public static synchronized DBConnectionManager getInstance()     throws SQLException    {        if (instance == null) {            instance = new DBConnectionManager();        }        return instance;    }   /**      * Returns a connection to the named pool.     *     * @param name The pool name as defined in the properties file     * @param con The Connection     */    public void freeConnection(String name, Connection con) {        DBConnectionPool pool = (DBConnectionPool) pools.get(name);        if (pool != null) {            pool.freeConnection(con);        }    }            /**     * Returns an open connection. If no one is available, and the max     * number of connections has not been reached, a new connection is     * created.     *     * @param name The pool name as defined in the properties file     * @return Connection The connection or null     */    public Connection getConnection(String name,String url,	      String username,String password) throws SQLException {	if (!clients.containsKey(name))	{	   createPools(name,url,username,password,0);	   clients.put(name,new Integer(0));	}	int iCurr = ((Integer)clients.get(name)).intValue();	iCurr++;	clients.put(name,new Integer(iCurr));        DBConnectionPool pool = (DBConnectionPool) pools.get(name);        if (pool != null) {            return pool.getConnection();        }        return null;    }        /**     * Closes all open connections and deregisters all drivers.     */    public synchronized void release(String name) throws SQLException {        // Wait until called by the last client	if (!clients.containsKey(name)) return;        int iCurr = ((Integer)clients.get(name)).intValue();	iCurr--;	clients.put(name,new Integer(iCurr));	if (iCurr > 0) return;	clients.remove(name);        DBConnectionPool pool = (DBConnectionPool)pools.get(name);        pool.release();        Enumeration allDrivers = drivers.elements();        while (allDrivers.hasMoreElements()) {            Driver driver = (Driver) allDrivers.nextElement();            DriverManager.deregisterDriver(driver);        }    }        private void createPools(String poolName,String url,	      String username,String password,int max) {       DBConnectionPool pool =           new DBConnectionPool(poolName,url,username,password, max);       pools.put(poolName, pool);       log("Initialized pool " + poolName);    }        /**     * Loads properties and initializes the instance with its values.     */    private void init() throws SQLException {        log = new PrintWriter(System.err);        loadDrivers();        //createPools(0);    }        /**     * Loads and registers all JDBC drivers. This is done by the     * DBConnectionManager, as opposed to the DBConnectionPool,     * since many pools may share the same driver.     *     * @param props The connection pool properties     */    private void loadDrivers() throws SQLException {       DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());    }        /**     * Writes a message to the log file.     */    private void log(String msg) {        log.println(new Date() + ": " + msg);    }        /**     * Writes a message with an Exception to the log file.     */    private void log(Throwable e, String msg) {        log.println(new Date() + ": " + msg);        e.printStackTrace(log);    }        /**     * This inner class represents a connection pool. It creates new     * connections on demand, up to a max number if specified.     * It also makes sure a connection is still open before it is     * returned to a client.     */    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;                /**         * Creates new connection pool.         *         * @param name The pool name         * @param URL The JDBC URL for the database         * @param user The database user, or null         * @param password The database user password, or null         * @param maxConn The maximal number of connections, or 0         *   for no limit         */        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;        }                /**         * Checks in a connection to the pool. Notify other Threads that         * may be waiting for a connection.         *         * @param con The connection to check in         */        public synchronized void freeConnection(Connection con) {            // Put the connection at the end of the Vector            freeConnections.addElement(con);            checkedOut--;            notifyAll();        }                /**         * Checks out a connection from the pool. If no free connection         * is available, a new connection is created unless the max         * number of connections has been reached. If a free connection         * has been closed by the database, it's removed from the pool         * and this method is called again recursively.         */        public synchronized Connection getConnection() throws SQLException {            Connection con = null;            if (freeConnections.size() > 0) {                // Pick the first Connection in the Vector                // to get round-robin usage                con = (Connection) freeConnections.firstElement();                freeConnections.removeElementAt(0);                if (con.isClosed()) {                    log("Removed bad connection from " + name);                    // Try again recursively                    con = getConnection();                }            }            else if (maxConn == 0 || checkedOut < maxConn) {                con = newConnection();            }            if (con != null) {                checkedOut++;            }            return con;        }                /**         * Closes all available connections.         */        public synchronized void release() throws SQLException {            Enumeration allConnections = freeConnections.elements();            while (allConnections.hasMoreElements()) {                Connection con = (Connection) allConnections.nextElement();                con.close();            }            freeConnections.removeAllElements();        }                /**         * Creates a new connection, using a userid and password         * if specified.         */        private Connection newConnection() throws SQLException {            Connection con = null;            if (user == null) {               con = DriverManager.getConnection(URL);            }            else {               con = DriverManager.getConnection(URL, user, password);            }            log("Created a new connection in pool " + name);            return con;        }    }}

⌨️ 快捷键说明

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