2017-01-23 19 views
1
PreparedStatement ps = null; 
ResultSet rs = null; 
try { 
    ps = getConnection().prepareStatement(sql); 
    if (ps != null) { 
     ps = doSomething(ps); 
     ps.executeUpdate(); 
    } 
} finally { 
    if (ps!=null) { 
     ps.close(); 
    } 
} 

private PreparedStatement doSomething(PreparedStatement ps) { 
    ps.setString(1, "test"); 
} 

«Выполнение обновления вызывается только один раз». Строка «sql» отличается в разных условиях и будет иметь различное количество переменных связывания, метод doSomething имеет разные реализации в подклассах для установки переменных привязки.В этом коде есть утечка ресурсов (подготовленный оператор)?

Eclipse жалуется на это как на потенциальную утечку из-за перераспределения подготовленного оператора. Есть ли утечка ресурсов здесь?

+1

(1) Рассмотрите возможность использования ресурсов. (2) Почему 'doSomething' должен * возвращать * инструкцию вместо того, чтобы просто изменять ее, как показано в этом примере? – chrylis

+0

Это потому, что doSomething переоценивается, чтобы делать разные вещи в разных подклассах. – gaenshr

+1

Это не отвечает на вопрос. Что он делает, это не может быть «пустотой»? – chrylis

ответ

-1

В строке:

ps = doSomething(ps); 

Исходное значение psможет быть отброшены, в зависимости от того, хранится doSomething.

В любом случае, Java хранит все под сборщиком мусора, поэтому нет ничего подобного утечке памяти. Назовите это падением или потерей.

+1

У вас может быть утечка памяти, например, с помощью кэша убегания, а Java может протекать как ресурсы, связанные с базой данных. – chrylis

+0

@chrylis OK, туземцы - это другое дело, я имел в виду чистую Java без внутренних элементов Sun и собственных потоков. –

+0

JDBC-соединения * - это чистая Java. – chrylis

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

  • Нет связанных вопросов^_^