У меня есть утечка соединения в некоторых старых веб-приложениях Java, которые не используют пул соединений. Попытка найти утечку затруднена, потому что ИТ-отдел не предоставит мне доступ к v$session SELECT Count(*) FROM v$session;
Поэтому вместо этого я пытаюсь выполнить отладку с помощью операторов System.out. Даже после закрытия соединения conn.close();
, когда я печатаю conn в файл системного журнала, он дает мне имя объекта соединения.
try {
Connection conn;
conn.close()
}
catch (SQLException e) { }
finally {
if (conn != null) {
try {
System.out.println("Closing the connection");
conn.close();
}
catch (Exception ex)
{
System.out.println("Exception is " + ex);
}
}
}
// I then check conn and it is not null and I can print the object name.
if (conn != null) {
System.out.println("Connection is still open and is " + conn);
}
однако, если я также добавлю conn = null;
под оператором conn.close();
, соединение теперь будет закрыто. Итак, мой вопрос: conn.close(); на самом деле освободить мое соединение, или мне также нужно сделать его нулевым, чтобы действительно освободить мое соединение. Как я уже сказал, мне очень сложно определить, действительно ли соединение разорвано, не имея возможности запросить v$session. Есть ли фрагмент кода Java, который может дать мне мои открытые соединения??
На данный момент это, вероятно, поучительно, потому что я планирую реорганизовать эти приложения для использования пула соединений, но сейчас я ищу быстрый бинт.
conn
внутри блокаtry
, то впоследствии это выходит за рамки, а также в блокеfinally
. Тем не менее, мне интересно, есть ли у вас переменная класса, которую вы затеняете, и, возможно, где-то затенение нарушается и оставляет утечку. - person Alex Poole   schedule 23.09.2010