在 DBCP 中登录

2022-09-04 04:13:04

我正在使用Apache Commons DBCP。有一个任务用于跟踪 DBCP 的内部行为 - 活动和空闲连接数。

我发现 DBCP 根本没有这样的日志记录。是的,tt 可以编写在从池借用连接时输出 BasicDataSource 状态的代码。但是,当返回或关闭连接时,无法跟踪 BasicDataSource 的状态,因为连接对象对池一无所知。

有什么想法吗?


答案 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,以及您要记录的确切内容。

附言:我还没有测试上面的代码。


答案 2

DBCP 的 BasicDataSource 包含一些受保护的方法,这些方法实际上创建了池和池工厂。您可以对它进行子类化并重写这些方法来更改行为;例如,获得池工厂或将其替换为您自己的池工厂。拥有该池后,即可在代码中获取池状态。


推荐