0

我正在编写代码以检测我的应用程序是否正在泄漏连接。我c3p0用作连接池。

在我的单元测试中,我试图创建一个@Rule在测试结束时检查没有挂起的连接。这将帮助我找到忘记关闭Connections 的代码。目前,这必须与 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()方法没有达到我想要的效果。

有人帮忙吗?

4

0 回答 0