[英]Connection pool for Distributed Web modules using Hibernate with C3P0
[英]Reload web server with gwt and c3p0 connection pool?
我有一个用gwt编写的Web应用程序,并且在后端使用了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开发模式下按黄色的“重新加载Web服务器”按钮并刷新页面时,收到以下警告,以及许多后续错误,这些错误阻止我获得数据库连接:
警告:C3P0Registry mbean已被注册。 这可能意味着已取消部署使用c3p0的应用程序,但并非所有PooledDataSources在取消部署之前都已关闭。 随着时间的流逝,这可能导致资源泄漏。 请注意关闭所有PooledDataSources。
我认为这意味着重新加载Web服务器不会关闭我所做的ComboPooledDataSource(可能是一个安全的假设)。 有什么办法可以做到这一点,以便在重新加载Web服务器后可以获得连接?
通常不建议关闭dataSource(不仅是C3P0),因为应从服务器上的许多应用程序中使用它们。 如果您杀死该连接池,其他连接池可能会丢失数据访问权限。 实际上,您应该将池管理留给您的容器,并且仅使用JNDI。
无论如何,如果您需要在GWT控制台中消除警告,请在EventListener contextDestroyer中使用此方法:
public abstract class YourListenerimplements EventListener {
//Probably you initialize your dataSource here. I do it with Guice.
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
...
}
@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);
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.