2016-09-13 4 views
1

У меня есть приложение, которое через некоторое время начинает давать мне внутреннюю ошибку сервера. Некоторые люди, которых я попросил, сказали мне, что это может быть из-за утечки Connection в моем приложении. Я начал поиск и нашел этот запрос для имитации утечки соединения.Найти утечку связи в приложении Java

select LAST_CALL_ET, SQL_TEXT, username, machine, to_char(logon_time, 'ddMon hh24:mi') as login, SQL_HASH_VALUE, PREV_HASH_VALUE, status from v$session, v$sql where username='USERNAME' and HASH_VALUE = PREV_HASH_VALUE order by last_call_et desc;.

Я отслеживал свое приложение с этим запросом и закрывал все просочившиеся соединения для запроса, показанного в этом результате. Но теперь мое приложение начинает давать такую ​​же ошибку для еще менее неактивных сеансов. Я использую правильный запрос, чтобы узнать об активной утечке сеанса/соединения? Кто-то сказало мне условие HASH_VALUE = PREV_HASH_VALUE в этом запросе не так, но я не знаю об этих колонках (не много знаний DB.)

Спасибо

+1

Вы закрываете все объекты 'Statement',' PreparedStatement', 'ResultSet' и' Connection'? – copeg

+0

@copeg Да Сэр, В настоящее время я ищу все запросы, которые входят в результат, и я закрываю все. Но иногда я вижу тот же запрос в неактивном результате сессии, блокируя некоторые другие запросы, даже если соединение и другие объекты закрыты. – aatif

+0

Является ли это веб-приложение или автономное приложение? В какой библиотеке пула соединений он используется? –

ответ

2

Если вам необходимо выяснить, утечки вы можете использовать профайлер как yourkit или jprofiler, который способен отслеживать утечки сокета/jdbc.

Чтобы устранить утечки, которые Вы должны узнать места, где вы вводные соединения и использовать примерочный с-ресурсами, которые будут делать все close() вещей для вас

try (Connection conection = DriverManager.getConnection(url); 
    PreparedStatement statement = createPreparedStatement(conection); 
    ResultSet resultSet = statement.executeQuery()) { 
    // process the resultSet here, all resources will be cleaned up 
} 
+0

Я закрываю все найденное соединение, но все же некоторые запросы блокируют другие. Я попробую «попробуй-с-ресурсами» и посмотрю, устранит ли это проблему. Спасибо – aatif

0

Большинство пулов соединений имеют конфигурацию для входа утечки соединения. Я не знаком с DBCP, но documentation указывает, что свойство logAbandoned будет регистрировать утечки соединения. Если вы установите для logAbandoned значение true, DCBP должен регистрировать трассировки стека через некоторое время после свойства таймаута пула. Трассировка стека будет содержать место, где было открыто утечное соединение.

Смежные вопросы