📄 dbconnectionmanager.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 + -