Пул соединений 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
1 ответ:
Ответ Да, это может вызвать проблемы. Как говорится Вот так:
- закрытие соединений JDBC в пуле
- JDBC MySql методы пула соединений, чтобы избежать исчерпанного пула соединений
Если вы не закроете ресурсы, связанные с подключением, в обратном порядке после завершения работы с ними (или в блоке finally), вы рискуете. Пулы соединений различаются в зависимости от того, как они их обрабатывают, но вызывает беспокойство-как минимум-то, что неправильно закрытый набор ресурсов выбрасывается обратно в пул.
В случае, если это было неясно (и вы, возможно, уже знаете об этом), правильное закрытие ресурсов обсуждается далее здесь:
Обратите внимание, что в предстоящей Java 7 здесь будет некоторая помощь:
Http://www.javaspecialists.eu/archive/Issue190.html
, в котором в Java вводится новый оператор try-with-resources, который автоматически закрывает все автоматически закрываемые ресурсы, указанные в инструкции try.
Comments