Вход в DBCP - PullRequest
       17

Вход в DBCP

13 голосов
/ 30 августа 2010

Я использую Apache Commons DBCP. Есть задача отследить внутреннее поведение DBCP - количество активных и незанятых соединений.

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

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 31 августа 2010

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

В принципе, вы можете написать аспект илидва, которые «зафиксируют» выполнение некоторых методов внутри DBCP.

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

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 или нет, и что именно вы хотите записать.

PS Я не проверял вышеуказанный код.

1 голос
/ 17 февраля 2011

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

0 голосов
/ 30 июня 2015

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

0 голосов
/ 11 марта 2012

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

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

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

...