【问题标题】:Reload web server with gwt and c3p0 connection pool?使用 gwt 和 c3p0 连接池重新加载 Web 服务器?
【发布时间】:2011-10-12 03:39:30
【问题描述】:

我有一个用 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 服务器后获得连接?

【问题讨论】:

    标签: java gwt connection-pooling c3p0


    【解决方案1】:

    通常不建议关闭数据源(不仅是 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);
            }
        }
    }
    

    }

    【讨论】:

    • 酷,谢谢。忘记了 ServletContextListener 和关于 dataSource 的好建议,尽管我相信这是将在我的服务器上运行的唯一应用程序,这对于开发模式目的来说更方便。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2013-08-20
    • 2010-11-30
    • 1970-01-01
    • 2015-09-23
    • 2019-12-31
    • 2013-04-25
    相关资源
    最近更新 更多