2009-06-19 4 views
3

Я запустил findbugs на нашей базе кода, и он указал, что еще два заявления, которые еще нужно закрыть. В этом разделе кода, который мы запускаем:Повторное использование подготовленного состояния

preparedStatement = connection.prepareStatement(query); 

для 3 различных запросов, повторное использование подготовлено. В конце концов блок мы закрыть ресурс:

finally{ 
    try{ 
     if (resultSet != null) 
     resultSet.close(); 
    } catch (Exception e) { 
     exceptionHandler.ignore(e); 
    } 
    try { 
     if (preparedStatement != null) 
     preparedStatement.close(); 
    } catch(Exception e) { 
     exceptionHandler.ignore(e); 
    } 

Если заявление закрывается до следующего connection.prepareStatement (запроса); или это подозрительные подозрения?

+2

Независимо от того, нужна ли эта ссылка, несущественна ли она. Когда вы вызываете connection.prepareStatement (query), вы создаете в этом соединении readyStatement. Они будут сидеть там, пока соединение не будет закрыто. Когда вы нажмете это, вы, наконец, закрываете только подготовленный оператор, на который указывает эта переменная. Оставляя 2 из 3, пока соединение не будет закрыто. В процессе производства вы продолжите утечку соединений и, в конечном счете, закончите, если не удалите Abandoned (tomcat) или тому подобное. – Zach

+0

Спасибо за объяснение! Добавлены изменения :) –

ответ

8

Да, инструкция должна быть закрыта перед выполнением следующего соединения .prepareStatement. В противном случае вы теряете свою ссылку на незакрытый предыдущий (иначе говоря, утечки). Оберните попытку {} наконец {} вокруг использования каждого утверждения, закрыв ее в конце.

+0

Также хотелось бы отметить, что при закрытии соединения необходимо очистить пропущенные сообщения, лучше закрыть их по отдельности. Если этот код повторяется несколько раз в открытом соединении, у вас будет нехватка ресурсов (2 оператора в момент времени =]) – MarquisDeMizzle