Пул соединений MySQL и JDBC: незамкнутые операторы



Я просматриваю большую кучу существующего кода, пытаясь найти незамкнутые соединения, которые вызвали бы исчерпание пула соединений или выброс других Erro.



В некоторых местах я вижу, что соединение возвращается в пул, результирующий набор закрывается, но PreparedStatement не закрывается.



В псевдокоде это будет выглядеть так:



Connection conn = null;
try {
conn = MyJdbcTemplateHolder.getNewConnectionFromPool();
PreparedStatement ps = conn.prepareStatement(sql, ...);
ResultSet rs = st.executeQuery();

// do stuff with results

} catch(Exception e) {
// exception
} finally {
rs.close();
MyJdbcTemplateHolder.returnConnectionToPool(conn);
//***** Here is what's missing: st.close(); *****
}


Вопрос в следующем: может ли открытое утверждение вызвать проблемы, потому что оно не было явно закрыто? или закрывает результирующий набор и достаточно ли вернуть связь?



Очевидно, что я говорю не об одном открытом заявлении - у нас есть пул из 100 соединений и десятки мест в коде, где эта проблема может возникнуть.


  • версия MySQL 5.1

  • Мой JDBC jar - это mysql-connector-java-5.1.11-bin.jar

633   1  

1 ответ:

Ответ Да, это может вызвать проблемы. Как говорится Вот так:

Если вы не закроете ресурсы, связанные с подключением, в обратном порядке после завершения работы с ними (или в блоке finally), вы рискуете. Пулы соединений различаются в зависимости от того, как они их обрабатывают, но вызывает беспокойство-как минимум-то, что неправильно закрытый набор ресурсов выбрасывается обратно в пул.

В случае, если это было неясно (и вы, возможно, уже знаете об этом), правильное закрытие ресурсов обсуждается далее здесь:

Обратите внимание, что в предстоящей Java 7 здесь будет некоторая помощь:

Http://www.javaspecialists.eu/archive/Issue190.html

, в котором в Java вводится новый оператор try-with-resources, который автоматически закрывает все автоматически закрываемые ресурсы, указанные в инструкции try.

Comments

    Ничего не найдено.