Я использую Apache Commons DBCP. Есть задача отследить внутреннее поведение DBCP - количество активных и незанятых соединений.
Я обнаружил, что в DBCP вообще нет такой регистрации. Да, можно написать код, который выводит состояние BasicDataSource, когда соединение заимствовано из пула. Однако нет способа отслеживать состояние BasicDataSource, когда соединение возвращается или закрывается, потому что объект соединения ничего не знает о пуле.
Есть идеи?
Я думаю, аспекты могут стать решением вашей проблемы. Проверьте:
По сути, вы можете написать один или два аспекта это «зафиксирует» выполнение некоторых методов внутри 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 или нет, и что именно вы хотите регистрировать.
П.С. Я не тестировал приведенный выше код.