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