All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.semanticwb.base.db.DBConnectionManager Maven / Gradle / Ivy

The newest version!
/*
 * SemanticWebBuilder es una plataforma para el desarrollo de portales y aplicaciones de integración,
 * colaboración y conocimiento, que gracias al uso de tecnología semántica puede generar contextos de
 * información alrededor de algún tema de interés o bien integrar información y aplicaciones de diferentes
 * fuentes, donde a la información se le asigna un significado, de forma que pueda ser interpretada y
 * procesada por personas y/o sistemas, es una creación original del Fondo de Información y Documentación
 * para la Industria INFOTEC, cuyo registro se encuentra actualmente en trámite.
 *
 * INFOTEC pone a su disposición la herramienta SemanticWebBuilder a través de su licenciamiento abierto al público (‘open source’),
 * en virtud del cual, usted podrá usarlo en las mismas condiciones con que INFOTEC lo ha diseñado y puesto a su disposición;
 * aprender de él; distribuirlo a terceros; acceder a su código fuente y modificarlo, y combinarlo o enlazarlo con otro software,
 * todo ello de conformidad con los términos y condiciones de la LICENCIA ABIERTA AL PÚBLICO que otorga INFOTEC para la utilización
 * del SemanticWebBuilder 4.0.
 *
 * INFOTEC no otorga garantía sobre SemanticWebBuilder, de ninguna especie y naturaleza, ni implícita ni explícita,
 * siendo usted completamente responsable de la utilización que le dé y asumiendo la totalidad de los riesgos que puedan derivar
 * de la misma.
 *
 * Si usted tiene cualquier duda o comentario sobre SemanticWebBuilder, INFOTEC pone a su disposición la siguiente
 * dirección electrónica:
 *  http://www.semanticwebbuilder.org
 */
package org.semanticwb.base.db;

import java.io.*;
import java.sql.*;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import javax.naming.Context;
import org.semanticwb.Logger;
import org.semanticwb.base.util.SWBProperties;
import org.semanticwb.SWBUtils;

// TODO: Auto-generated Javadoc
/**
 * Esta clase proporciona acceso a uno o más connection pools
 * definidos en el archivo de propiedades db.properties. 
 *
 * @author  Javier Solis Gonzalez ([email protected])
 */
public class DBConnectionManager {

    /** The log. */
    private static Logger log = SWBUtils.getLogger(DBConnectionManager.class);
    
    /** The drivers. */
    private Vector drivers = new Vector();
    
    /** The pools. */
    private Hashtable pools = new Hashtable();
    
    /** The is jndi. */
    private boolean isJNDI;
    
    /** The JNDI patern. */
    private String JNDIPatern;
    
    /** The init ctx. */
    private Context initCtx;
    
    /** The time lock. */
    private PoolConnectionTimeLock timeLock = new PoolConnectionTimeLock();

    /**
     * Instantiates a new dB connection manager.
     */
    public DBConnectionManager()
    {
        log.event("Initializing DBConnectionManager...");
        init();
    }

    /**
     * Gets the num connections.
     * 
     * @return the num connections
     * @return
     */
    public int getNumConnections()
    {
        int cl = 0;
        Enumeration allPools = pools.elements();
        if (!isJNDI)
        {
            while (allPools.hasMoreElements())
            {
                DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
                cl += pool.freeConnections.size();
            }
        }
        return cl;
    }

    /**
     * Gets the connections.
     * 
     * @param name the name
     * @return the connections
     * @return
     */
    public int getConnections(String name)
    {
        int cl = 0;
        if (!isJNDI)
        {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null)
            {
                cl = pool.checkedOut;
            }
        }
        return cl;
    }

    /**
     * Gets the free connections.
     * 
     * @param name the name
     * @return the free connections
     * @return
     */
    public int getFreeConnections(String name)
    {
        int cl = 0;
        if (!isJNDI)
        {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null)
            {
                cl = pool.freeConnections.size();
            }
        }
        return cl;
    }

    /**
     * Cierra una conexi�n del pool especificado.
     * 
     * @param name the name
     * @param con the con
     */
    public void freeConnection(String name, Connection con)
    {
        if (!isJNDI)
        {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null)
            {
                pool.freeConnection(con);
            }
        } else
        {
            try
            {
                if (con != null)
                {
                    con.close();
                }
            } catch (SQLException ex)
            {
                log.error("Error to create JNDI Pool Connection...", ex);
            }
        }
    }

    /**
     * Regresa una conexión que no pertenece al pool.
     * 
     * @param name the name
     * @return  Connection  La conexi�n o nulo.
     */
    public Connection getNoPoolConnection(String name)
    {
        Connection ret = null;
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null)
        {
            ret = pool.newNoPoolConnection();
        }
        return ret;
    }

    /**
     * Regresa una conexión que no se registra en el pool, pero que se auto restablece si se piede la conexion.
     * 
     * @param name the name
     * @return  Connection  La conexi�n o nulo.
     */
    public Connection getAutoConnection(String name)
    {
        Connection ret = null;
        DBConnectionPool pool = (DBConnectionPool) pools.get(name);
        if (pool != null)
        {
            ret = pool.newAutoConnection();
        }
        return ret;
    }

    /**
     * Regresa una conexi�n abierta. Si ninguna otra conexi�n est� disponible y el n�mero m�ximo
     * de conexiones no se ha alcanzado, una nueva conexi�n es creada.
     * 
     * @param name the name
     * @return  Connection  La conexi�n o nulo.
     */
    public Connection getConnection(String name)
    {
        return getConnection(name, null);
    }

    /**
     * Regresa una conexi�n abierta. Si ninguna otra conexi�n est� disponible y el n�mero m�ximo
     * de conexiones no se ha alcanzado, una nueva conexi�n es creada.
     * 
     * @param name the name
     * @param description the description
     * @return  Connection  La conexi�n o nulo.
     */
    public Connection getConnection(String name, String description)
    {
        Connection ret = null;
        if (!isJNDI)
        {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null)
            {
                PoolConnection con = (PoolConnection) pool.getConnection();
//                if (con != null)
//                {
//                    if (description == null)
//                    {                        
//                        description = "NoDesc";                        
//                        try
//                        {
//                            StringBuffer buf=new StringBuffer();
//                            buf.append("Trace detail:\n");
//                            //System.out.print(" getConnection 1");
//                            StackTraceElement eles[]=Thread.currentThread().getStackTrace();
//                            //System.out.print(" 2");
//                            for(int i=0;i
     * <poolname>.url         El URL JDBC de la base de datos.
     * <poolname>.user        Un usuario de la base de datos (opcional)
     * <poolname>.password    El password del usuario de la base de datos. (Si el usuario se especifica)
     * <poolname>.maxconn     El n�mero m�ximo de conexiones (opcional)
     * 
* * @param props the props */ 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.error("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"); String sidle_time = props.getProperty(poolName + ".idle_time", "0"); if (user != null) { user = user.trim(); } if (password != null) { password = password.trim(); } int max; try { max = Integer.parseInt(maxconn.trim()); } catch (NumberFormatException e) { log.warn("Invalid maxconn value " + maxconn + " for " + poolName); max = 0; } long idle_time = 0; try { idle_time = Long.parseLong(sidle_time.trim()); } catch (NumberFormatException e) { log.warn("Invalid idle_time value " + sidle_time + " for " + poolName); idle_time = 0; } DBConnectionPool pool = new DBConnectionPool(this, poolName, url, user, password, max, idle_time); pools.put(poolName, pool); log.info("Initialized Connection Pool [" + poolName + "]"); } } } /** * Carga las propiedades e inicializa la instancia con sus valores. */ private void init() { InputStream is = getClass().getResourceAsStream("/db.properties"); Properties dbProps = new SWBProperties(); try { if (is != null) { dbProps.load(is); } else { throw new FileNotFoundException(); } is.close(); } catch (Exception e) { log.error("Can't read the properties file. Make sure db.properties is in the CLASSPATH", e); return; } String jndi = dbProps.getProperty("jndi_pool", "false"); if (jndi.equals("true")) { log.info("JDNI Pool found..."); isJNDI = true; JNDIPatern = dbProps.getProperty("jndi_patern", "java:comp/env/jdbc/"); try { initCtx = new InitialContext(); } catch (javax.naming.NamingException ex) { log.error("Error to initialize JNDI Context", ex); } } if (!isJNDI) { loadDrivers(dbProps); createPools(dbProps); } } /** * Carga y registra todos los drivers JDBC. Esto lo realiza el DBConnectionManager, en comparaci�n * con el DBConnectionPool, puesto que muchos pools pueden compartir el mismo driver. * * @param props the props */ 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.info("Registered JDBC driver " + driverClassName); } catch (Exception e) { log.error("Can't register JDBC driver: " + driverClassName + ", Exception: " + e); } } } /** Getter for property timeLock. * @return Value of property timeLock. * */ public PoolConnectionTimeLock getTimeLock() { return timeLock; } /** Getter for property pools. * @return Value of property pools. * */ public java.util.Hashtable getPools() { java.util.Hashtable map = new java.util.Hashtable(); Enumeration en = pools.keys(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); Object obj = pools.get(key); if (obj instanceof DBConnectionPool) { map.put(key, obj); } } return map; } /** * Gets the hits. * * @return Regresa las total de solicitudes de conexiones */ public long getHits() { long hits = 0; Enumeration en = pools.elements(); while (en.hasMoreElements()) { Object obj = en.nextElement(); if (obj instanceof DBConnectionPool) { hits += ((DBConnectionPool) obj).getHits(); } } return hits; } }



© 2015 - 2024 Weber Informatics LLC | Privacy Policy