Вход в систему DBCP

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

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

Есть идеи?

13
задан skaffman 17 January 2011 в 10:19
поделиться

1 ответ

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

По сути, вы можете написать один или два аспекта это «зафиксирует» выполнение некоторых методов внутри 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 или нет, и что именно вы хотите регистрировать.

П.С. Я не тестировал приведенный выше код.

7
ответ дан 2 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: