2010-08-30 4 views
13

Я использую DBCP Apache. Существует задача отслеживать внутреннее поведение DBCP - количество активных и незанятых соединений.Вход в систему DBCP

Я узнал, что DBCP вообще не имеет такой регистрации. Да, tt можно написать код, который выводит статус источника BasicDataSource, когда соединение заимствовано из пула. Однако нет способа отслеживать состояние источника BasicDataSource при возврате или закрытии соединения, поскольку объект подключения ничего не знает о пуле.

Любые идеи?

ответ

7

Я думаю, что аспекты могут быть решением вашего quandry. Проверьте:

В принципе, вы можете написать аспект или два, которые будут "зацепиться" на выполнение некоторых методов внутри ДБХП.

Что-то вроде:

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; 
    } 

} 

Это лишь небольшой пример. Аспекты действительно мощные, и есть множество способов сделать то, что вы хотите. Код зависит от того, используете ли вы Spring или нет, и что именно вы хотите записать.

P.S. Я не тестировал вышеуказанный код.

1

База данных DBCP BasicDataSource содержит несколько защищенных методов, которые фактически создают пулы и пул-заводы. Вы можете подклассифицировать его и переопределить эти методы для изменения поведения; например, чтобы завладеть фабрикой пулов или заменить его на свой собственный. После того, как у вас есть этот пул, вы можете войти в состояние пула в своем коде.

0

AOP - это путь для отслеживания использования соединения из пула. Однако, это не очень прямолинейно. Вам нужно сделать следующее:

  1. Создать класс ConnectionWrapper, который оборачивает (декоратор) Подключение и overrride метод Close() дополнительно войти в идентификатор соединения, идентификатор потока и действие «закрыть»
  2. перехватывать getConnection() для источника данных.
  3. В этом методе, необходимо войти в идентификатор соединения, идентификатор потока и действия «открытого»
  4. В том же способе украсить исходное соединение и вернуть ваш экземпляр ConnectionWrapper

С помощью этой установки вы можете отслеживать и заем & возврат соединения из/в пул.

0

Если у вас есть доступ к объекту DataSource, вы можете привести его к BasicDataSource и получить соединения maxIdle и maxActive использованием getNumActive() и getNumIdle() методы.

+0

, где вызывается connection.close(), нет доступа к объекту DataSource. Таким образом, невозможно передать его в BasicDataSource и получить maxIdle и maxActive. – kachanov

+0

Connection.close() не равно Datasource.close() –

+0

Вы можете где-то ссылаться на источник данных и что делать. –