登录DBCP

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

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

有任何想法吗?

我认为方面可能是你的quandry的解决方案。 查看:

基本上,您可以编写一个或两个方面来“锁定”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我还没有测试过上面的代码。

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

AOP是跟踪池中连接使用情况的方法。 但是,它不是很直接。 您需要执行以下操作:

  1. 创建一个包装(装饰器模式)连接的ConnectionWrapper类并覆盖close()方法以另外记录连接ID,线程ID和操作’close’
  2. 拦截数据源的getConnection()方法。
  3. 在该方法中,记录连接ID,线程ID和操作’打开’
  4. 在同一方法中,装饰原始连接并返回ConnectionWrapper实例

通过此设置,您可以跟踪从/向池的借用和返回。

如果您有权访问DataSource对象,则可以使用getNumActive()getNumIdle()方法将其maxIdle maxActivemaxIdle并获取maxIdlemaxActive连接。