我正在编写代码以检测我的应用程序是否正在泄漏连接。我使用c3p0
作为连接池。
在单元测试中,我尝试创建一个@Rule
,以在测试结束时检查是否有未决的连接。这将帮助我找到忘记关闭Connection
的代码。目前,它必须与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()
方法无法实现我想要实现的目标。
有人帮忙吗?