在 DBCP 中登录
2022-09-04 04:13:04
我正在使用Apache Commons DBCP。有一个任务用于跟踪 DBCP 的内部行为 - 活动和空闲连接数。
我发现 DBCP 根本没有这样的日志记录。是的,tt 可以编写在从池借用连接时输出 BasicDataSource 状态的代码。但是,当返回或关闭连接时,无法跟踪 BasicDataSource 的状态,因为连接对象对池一无所知。
有什么想法吗?
我正在使用Apache Commons DBCP。有一个任务用于跟踪 DBCP 的内部行为 - 活动和空闲连接数。
我发现 DBCP 根本没有这样的日志记录。是的,tt 可以编写在从池借用连接时输出 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,以及您要记录的确切内容。
附言:我还没有测试上面的代码。
DBCP 的 BasicDataSource 包含一些受保护的方法,这些方法实际上创建了池和池工厂。您可以对它进行子类化并重写这些方法来更改行为;例如,获得池工厂或将其替换为您自己的池工厂。拥有该池后,即可在代码中获取池状态。