Наш стандартный раздел кода для использования JDBC ...
Connection conn = getConnection(...);
Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rset = stmt.executeQuery (sqlQuery);
// do stuff with rset
rset.close(); stmt.close(); conn.close();
Вопрос 1: следует ли при использовании пула подключений закрывать подключение в конце? Если да, то не потеряна ли цель объединения? А если нет, то как DataSource узнает, что конкретный экземпляр Connection освобожден и может быть использован повторно? Я немного запутался в этом, любые указатели оценены.
Вопрос 2: близок ли следующий метод к стандартному? Похоже на попытку получить соединение из пула, и если DataSource не может быть установлен, используйте старомодный DriverManager. Мы даже не уверены, какая часть выполняется во время выполнения. Повторяя вопрос выше, следует ли закрывать соединение, выходящее из такого метода?
Спасибо, - ср.
synchronized public Connection getConnection (boolean pooledConnection)
throws SQLException {
if (pooledConnection) {
if (ds == null) {
try {
Context envCtx = (Context)
new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
return ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}}
return (ds == null) ? getConnection (false) : ds.getConnection();
}
return DriverManager.getConnection(
"jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}
Изменить: я думаю, что мы получаем объединенное соединение, так как мы не видим трассировку стека.
источник
getConnection()
. Просто сделайте это в c'tor или блоке инициализации того же класса, без синхронизации / нулевых проверок. Он будет вызван только один раз. Для получения дополнительных подсказок и примеров начала, эта статья может оказаться полезной.close()
всех вfinally
блоке того жеtry
блока, в котором вы их приобрели / создали. Это полностью независимо от того, объединенное ли это соединение или нет.Пулы обычно возвращают вам завернутый объект Connection, в котором метод close () переопределяется, обычно возвращая соединение в пул. Вызов close () в порядке и, вероятно, все еще требуется.
Метод close (), вероятно, будет выглядеть так:
Что касается вашего второго вопроса, вы можете добавить регистратор, чтобы показать, запускается ли когда-либо нижний блок. Я предполагаю, что вам нужен только тот или иной способ конфигурации соединений с базой данных. Мы используем только пул для доступа к нашей базе данных. В любом случае, закрытие соединения было бы очень важным для предотвращения утечек.
источник
Calling close() is OK and probably still required.
, отсутствие вызова close приведет к утечке соединения, если пул не реализует какую-либо стратегию восстановленияНа самом деле, лучший подход к управлению соединениями - не передавать их в какой-либо код.
Создайте класс SQLExecutor, который является единственным местом, которое открывает и закрывает соединения.
Затем все остальное приложение закачивает операторы в исполнитель, вместо того, чтобы получать соединения из пула и управлять ими (или неправильно управлять ими) повсюду.
Вы можете иметь столько экземпляров исполнителя, сколько хотите, но никто не должен писать код, который открывает и закрывает соединения от своего имени.
Удобно, что это также позволяет вам регистрировать весь ваш SQL из единого набора кода.
источник