Перезагрузить веб-сервер с пулом соединений gwt и c3p0? - PullRequest
0 голосов
/ 12 октября 2011

У меня есть веб-приложение, написанное на gwt, и я использую базу данных PostgreSQL в бэкэнде. Когда я делаю новый сеанс на сервере, я настраиваю c3p0 и получаю соединение jdbc:

ComboPooledDataSource source = new ComboPooledDataSource();
Properties connectionProps = new Properties();
connectionProps.put("user", "username");
connectionProps.put("password", "password");   
source.setProperties(connectionProps);
source.setJdbcUrl("some jdbc url that works");

и когда я закрываю сеанс на сервере, я закрываю ComboPooledDataSource.

Однако ... когда я нажимаю желтую кнопку "перезагрузить веб-сервер" в режиме разработки GWT и обновляю свою страницу, я получаю следующее предупреждение и кучу последующих ошибок, мешающих мне получить соединение с базой данных:

ПРЕДУПРЕЖДЕНИЕ: Mbean C3P0Registry уже зарегистрирован. Это, вероятно, означает, что приложение, использующее c3p0, было не развернуто, но не все PooledDataSources были закрыты до отмены развертывания. Это может привести к утечке ресурсов с течением времени. Пожалуйста, позаботьтесь о том, чтобы закрыть все PooledDataSources.

То, что я предполагаю, означает, что перезагрузка веб-сервера не закрыла созданный мной ComboPooledDataSource (вероятно, безопасное предположение). Есть ли способ заставить его сделать это, чтобы я мог получить соединение после перезагрузки веб-сервера?

1 Ответ

1 голос
/ 12 октября 2011

Закрытие источника данных вообще (не только C3P0) нежелательно, потому что их следует использовать из многих приложений на вашем сервере. Если вы уничтожите этот пул соединений, другие могут потерять доступ к данным. На практике вы должны оставить управление пулом для своего контейнера и использовать только JNDI.

В любом случае, если вы хотите избавиться от предупреждения в консоли GWT, используйте этот метод в вашем EventListener contextDestroyer: <pre> public abstract class YourListenerimplements EventListener { //Probably you initialize your dataSource here. I do it with Guice. @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ... }</p> <pre><code>@Override public void contextDestroyed(ServletContextEvent servletContextEvent) { try { connection = dataSource.getConnection(); //Your dataSource (I obtain it from Guice) } catch (SQLException ex) { } finally { try { if (connection != null) { connection.close(); } if (dataSource != null) { try { DataSources.destroy(dataSource); dataSource = null; } catch (Exception e) { } } } catch (SQLException sQLException) { XLog.error(sQLException); } } }

}

...