home *** CD-ROM | disk | FTP | other *** search
Wrap
Java Source | 2003-12-19 | 8.5 KB | 215 lines
package it.favaroni.db.connectionpool; /** * Gestore del pool di connessioni. * Data di creazione: (26/06/2003 10.04.45) * @author: Roberto Favaroni */ import java.util.*; import java.sql.*; import it.favaroni.wrapper.PropertiesFileHandler; import org.apache.log4j.*; public class ConnectionPool { private static ConnectionPool connectionPool = null; private Hashtable pool = new Hashtable(); private ConnectionManager connectionManager = null; private ConnectionParameters connectionParameters = new ConnectionParameters(); private Logger logger = null; /** * Commento del constructor ConnectionPool. */ private ConnectionPool() { super(); try { //configurazione log4j PropertiesFileHandler props = PropertiesFileHandler.getInstance("connectionpool.properties"); setLogger(Logger.getLogger(this.getClass().getName())); PropertyConfigurator.configure(props.readProperty("log4j.file.url")); getLogger().info("creazione istanza ConnectionPool"); getLogger().info("acquisizione parametri dal file di properties"); //acquisizione parametri dal file di properties getConnectionParameters().setDriver(props.readProperty("jdbc.driver")); getConnectionParameters().setUrl(props.readProperty("jdbc.url")); getConnectionParameters().setUser(props.readProperty("jdbc.user")); getConnectionParameters().setPassword(props.readProperty("jdbc.password")); getConnectionParameters().setMinConns(Integer.parseInt(props.readProperty("pool.minConns"))); getConnectionParameters().setMaxConns(Integer.parseInt(props.readProperty("pool.maxConns"))); getConnectionParameters().setMaxInUse(Integer.parseInt(props.readProperty("pool.maxInUse"))); getConnectionParameters().setCleaningInterval(Integer.parseInt(props.readProperty("manager.cleaningInterval"))); //lancio del connection manager getLogger().info("creazione e partenza istanza ConnectionManager con intervallo di " + getConnectionParameters().getCleaningInterval() + " secondi" ); connectionManager = new ConnectionManager(getConnectionParameters().getCleaningInterval()); getConnectionManager().setAlive(true); (new Thread(getConnectionManager()).start()); //registrazione driver del dbms Class.forName(getConnectionParameters().getDriver()); //creazione pool di connessioni minimo getLogger().info("creazione pool minimo di " + getConnectionParameters().getMinConns() + " connessioni"); for (int i = 0; i < getConnectionParameters().getMinConns(); i++) { makeConnection(); } } catch (Exception e) { getLogger().fatal(e.getMessage()); } } void cleanPool() throws SQLException { //ricerca connessioni appese getLogger().info("start pulizia del pool"); for (Enumeration enum = getPool().elements(); enum.hasMoreElements();) { ConnectionItem currItem = (ConnectionItem) enum.nextElement(); if (currItem.isInUse()) { java.util.Date now = new java.util.Date(); long diff = now.getTime() - currItem.getDate().getTime(); if (diff > (getConnectionParameters().getMaxInUse() * 1000)) { //connessione aperta da pi∙ tempo rispetto al max stabilito //rilascio forzato della connessione getLogger().error("rilascio forzato della connessione con progressivo " + currItem.getCounter() + " aperta da " + (diff/1000) + " secondi rispetto al max stabilito di " + getConnectionParameters().getMaxInUse() + " secondi"); releaseConnection(currItem.getConnection()); } } } getLogger().info("stop pulizia del pool; connessioni esaminate: " + getPool().size()); } private void closeConnection(ConnectionItem currItem) throws SQLException { //chiusura e rimozione dal pool della connessione currItem.getConnection().close(); getLogger().info("chiusura e rimozione dal pool della Connection con progressivo " + currItem.getCounter()); getPool().remove(currItem.getConnection().toString()); } private void closePool() throws SQLException { for (Enumeration enum = getPool().elements(); enum.hasMoreElements();) { closeConnection((ConnectionItem) enum.nextElement()); } } protected void finalize() throws Throwable { super.finalize(); getLogger().info("distruzione istanza ConnectionPool"); //stop del connection manager getLogger().info("distruzione istanza ConnectionManager"); getConnectionManager().setAlive(false); //libero il pool closePool(); } /** * * @return it.favaroni.db.connectionpool.ConnectionManager */ private ConnectionManager getConnectionManager() { return connectionManager; } /** * * @return it.favaroni.db.connectionpool.ConnectionParameters */ private ConnectionParameters getConnectionParameters() { return connectionParameters; } public synchronized Connection getFreeConnection() throws SQLException, MaxNumberConnectionException { //ricerca connessione non in uso for (Enumeration enum = getPool().elements(); enum.hasMoreElements();) { ConnectionItem currItem = (ConnectionItem) enum.nextElement(); if (!currItem.isInUse()) { //aggiornamento pool currItem.setInUse(true); getPool().put(currItem.getConnection().toString(), currItem); getLogger().info("acquisizione Connection con progressivo " + currItem.getCounter()); return currItem.getConnection(); } } //non Φ stata trovata connessione non in uso, creazione di una nuova getLogger().info("connessione attualmente non disponibile; richiesta creazione istanza Connection"); return makeConnection(); } public static synchronized ConnectionPool getInstance() { //gestione singola istanza della classe con pattern singleton if (connectionPool == null) { connectionPool = new ConnectionPool(); } return connectionPool; } /** * * @return org.apache.log4j.Logger */ private org.apache.log4j.Logger getLogger() { return logger; } /** * * @return java.util.Hashtable */ private java.util.Hashtable getPool() { return pool; } private Connection makeConnection() throws SQLException, MaxNumberConnectionException { Connection newConnection = null; //controllo su limite max stabilito di connessioni if (getConnectionParameters().getMaxConns() == getPool().size()) { getLogger().error("richiesta connessione eccedente al numero max stabilito del pool"); throw new MaxNumberConnectionException(); } //creazione connessione newConnection = DriverManager.getConnection( getConnectionParameters().getUrl(), getConnectionParameters().getUser(), getConnectionParameters().getPassword()); //inserimento nel pool releaseConnection(newConnection); return newConnection; } public synchronized void releaseConnection(Connection connection) { //estrazione dal pool dell'item corrispondente ConnectionItem currItem = (ConnectionItem) getPool().get(connection.toString()); if (currItem == null) { //ConnectionItem non trovato se richiamato da makeConnection per inizializzare l'item currItem = new ConnectionItem(); currItem.setConnection(connection); currItem.setCounter(getPool().size() + 1); getLogger().info("creazione e apertura istanza Connection con progressivo: " + currItem.getCounter()); } //aggiornamento del pool currItem.setInUse(false); getPool().put(connection.toString(), currItem); getLogger().info("rilascio istanza Connection con progressivo " + currItem.getCounter()); } /** * * @param newConnectionManager it.favaroni.db.connectionpool.ConnectionManager */ private void setConnectionManager(ConnectionManager newConnectionManager) { connectionManager = newConnectionManager; } /** * * @param newConnectionParameters it.favaroni.db.connectionpool.ConnectionParameters */ private void setConnectionParameters(ConnectionParameters newConnectionParameters) { connectionParameters = newConnectionParameters; } /** * * @param newLogger org.apache.log4j.Logger */ private void setLogger(org.apache.log4j.Logger newLogger) { logger = newLogger; } /** * * @param newPool java.util.Hashtable */ private void setPool(java.util.Hashtable newPool) { pool = newPool; } }