#java #database #apache-commons-dbcp #mssql-jdbc
#java #База данных #apache-commons-dbcp #mssql-jdbc
Вопрос:
Я использую пул соединений dbcp и выполняю длительные хранимые процедуры. Открыто несколько соединений, и серверная машина базы данных (mssql) отключается, что оставляет эти соединения открытыми. Как я могу получить список открытых соединений из пула и закрыть их вручную из моего веб-приложения Java?
InitialContext initCtx = new InitialContext();
Object obj = initCtx.lookup("java:comp/env/jdbc/oscon");
BasicDataSource source = (BasicDataSource) obj;
Я использую commons-dbcp2-2.0.1.jar
Ответ №1:
Вам не нужно закрывать их вручную. Лучше всего просто настроить тестирование соединения, и в этом случае c3p0 будет молча (но лениво) закрывать старые соединения и приобретать новые.
Если вы хотите быть более активным, просто вызовите hardReset() в источнике данных c3p0 (после приведения его к PooldedDataSource .
Комментарии:
1. Как можно преобразовать BasicDataSource в PooledDataSource?
2. InitialContext initCtx = новый InitialContext(); Object obj = initCtx.lookup(«java:comp/env/jdbc/oscon»); Источник BasicDataSource = (BasicDataSource) obj; Источник PooledDataSource pds = (PooledDataSource) DataSources.PooledDataSource(источник); pds.hardReset();
3. c3p0 не предлагает BasicDataSource . после поиска попробуйте
PooledDataSource pds = (PooledDataSource) obj;
напрямую. затем полный сброс, как вы уже сделали.4. Ничто из того, что вы делаете, не должно создавать новый источник данных или пул соединений (если только первый не был инициализирован). Поиск найдет существующий экземпляр источника данных, если он существует в вашей JVM и ClassLoader. Вы не используете класс фабрики источников данных для создания нового экземпляра, эти документы не имеют значения. Ваш экземпляр поступает из JNLP, однако вы его настроили и настроили.
5. Извините, что его dbcp не c3p0. Я изменил основное описание. Не могли бы вы дать мне решение для того же самого?