我正在编写代码以检测我的应用程序是否正在泄漏连接。我c3p0
用作连接池。
在我的单元测试中,我试图创建一个@Rule
在测试结束时检查没有挂起的连接。这将帮助我找到忘记关闭Connection
s 的代码。目前,这必须与 c3p0 池一起使用。
我写了以下代码:
public class ConnectionLeakChecker extends Verifier
{
private DataSource dataSource;
@Override
protected void verify() throws Throwable
{
if (dataSource == null)
return;
if (dataSource instanceof PooledDataSource)
{
PooledDataSource pool = (PooledDataSource) dataSource;
int numBusyConnectionsDefaultUser = pool.getNumBusyConnectionsDefaultUser();
if (numBusyConnectionsDefaultUser > 0)
throw new AssertionError("Connections not released: " + numBusyConnectionsDefaultUser);
}
else
throw new AssertionError("Database pool type not supported: " + dataSource.getClass().getCanonicalName());
}
public DataSource getDataSource()
{
return dataSource;
}
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
}
}
但是,当将组件实例化为@Rule 时,它会随机检测一个挂起的连接(在我当前的测试中,我只使用一个)。
有些测试会挂起连接,有些则不会。如果我单独运行一个失败的测试,我通常不会再收到任何投诉。
我认为该getNumBusyConnectionsDefaultUser()
方法没有达到我想要的效果。
有人帮忙吗?