检测合并的DataSource中的连接泄漏

时间:2019-03-29 22:28:34

标签: connection-pooling c3p0 connection-leaks

我正在编写代码以检测我的应用程序是否正在泄漏连接。我使用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()方法无法实现我想要实现的目标。

有人帮忙吗?

0 个答案:

没有答案