Обнаружение утечек соединения в объединенном источнике данных - PullRequest
0 голосов
/ 30 марта 2019

Я пишу код, чтобы определить, имеет ли мое приложение утечки соединений или нет.Я использую 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() не дает того, чего я хотел бы достичь.

Кто-нибудь поможет?

...