2010-08-30 12 views
13

Estoy usando Apache Commons DBCP. Hay una tarea para rastrear el comportamiento interno del DBCP: el número de conexiones activas e inactivas.Iniciando sesión en DBCP

Descubrí que DBCP carece de tal registro en absoluto. Sí, es posible escribir el código que genera el estado de BasicDataSource cuando se toma prestada la conexión del conjunto. Sin embargo, no hay forma de rastrear el estado de BasicDataSource cuando se devuelve o cierra la conexión, porque el objeto de conexión no sabe nada sobre el conjunto.

¿Alguna idea?

Respuesta

7

Creo que los aspectos pueden ser la solución a su negocio. Salida:

Básicamente, se puede escribir un aspecto o dos que va a "agarrarse" la ejecución de algunos métodos dentro de DBCP.

Algo así como:

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.ProceedingJoinPoint; 

@Aspect 
public class AroundExample { 

    @Around("org.apache.commons.dbcp.PoolingDataSource.getConnection()") 
    public Object doBasicPStuff(ProceedingJoinPoint pjp) throws Throwable { 
    // write code to do what you want 
    final PoolingDataSource ds = (PoolingDataSource) pjp.getThis(); 
    // log whatever you want 

    // let it finish 
    Object retVal = pjp.proceed(); 
    // stop stopwatch 
    return retVal; 
    } 

} 

Eso es sólo un pequeño ejemplo. Los aspectos son realmente poderosos y hay muchas maneras diferentes de hacer lo que quiere. El código depende de si está usando Spring o no, y qué es exactamente lo que quiere iniciar sesión.

P.S. No he probado el código anterior.

1

BasicDataSource de DBCP contiene algunos métodos protegidos que realmente crean los pools y las fábricas de pool. Puede subclasificarlo y anular esos métodos para cambiar el comportamiento; por ejemplo, para tener acceso a la fábrica de piscinas o reemplazarla por la suya. Una vez que tenga ese grupo, puede obtener el estado de grupo dentro de su código.

0

AOP es el camino a seguir para rastrear el uso de la conexión de la agrupación. Sin embargo, no es muy directo. Que tiene que hacer lo siguiente:

  1. crear una clase ConnectionWrapper que envuelve (Decorator) Conexión y overrride el método close() para iniciar la sesión, además, el id de conexión, ID del tema y la acción 'cerca'
  2. interceptar la Método getConnection() de la fuente de datos.
  3. En ese método, registrar el ID de conexión, ID del tema y la acción 'abierta'
  4. En el mismo método, decorar la conexión original y de vuelta a su instancia ConnectionWrapper

Con esta configuración, puede realizar un seguimiento tanto el préstamo & retorno de la conexión desde/hacia la piscina.

0

Si usted tiene acceso al objeto DataSource, puede echarlo a BasicDataSource y obtener los maxIdle y maxActive conexiones usando getNumActive() y getNumIdle() métodos.

+0

donde se llama a connection.close() no hay acceso al objeto DataSource. Por lo tanto, no es posible convertirlo a BasicDataSource y obtener maxIdle y maxActive. – kachanov

+0

Connection.close() no es igual a Datasource.close() –

+0

Puede mantener la referencia a Datasource en alguna parte y eso debería hacer. –

Cuestiones relacionadas