【问题标题】:Glassfish JDBC Connection Pooling Issue on UbuntuUbuntu 上的 Glassfish JDBC 连接池问题
【发布时间】:2015-11-16 07:49:46
【问题描述】:

在 Glassfish4 和 Ubuntu 14.04 上部署后我面临的一个严重问题。在java中,由于某些原因,我没有使用hibernate。作为查询的结果,我手动获取结果集,将结果集发送到 JSP 页面并对其进行迭代。

问题是,我将 finally 块设置如下:

 finally {
            try {

                if (conn != null) {
                    conn.close();
                }
                if (ctx != null) {
                    ctx.close();
                }
                if (cstatement != null) {
                    cstatement.closeOnCompletion();
                }

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

因为我通过会话将结果集发送到 JSP 页面,所以我正在关闭 JSP 页面上的结果,如下所示:

if(resultset!=null) resultset.close();

现在,问题是,几分钟后我的应用程序开始发出异常,表明已使用最大连接池。

我应该怎么做才能避免异常?

【问题讨论】:

  • 你不应该以相反的顺序关闭资源吗?

标签: java ubuntu jdbc glassfish connection-pooling


【解决方案1】:

您当前的 finally 块的问题是:

如果关闭命令之一引发任何异常,则将不会运行以下命令。由于问题似乎是资源泄漏,所以这可能是原因。

如果你是在JDK7+下运行并且资源是可自动关闭的,请尝试使用

try(Connection conn=DriverManager.getConnection();
  Statement stat=conn.createStatement){
}

然后资源将在退出 try 块时安全关闭。

如果您需要从 finally 块中关闭资源,请尝试为每个关闭语句包装一个 try catch。

对于关闭资源的排序,请始终先关闭您稍后创建的资源。

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2011-10-24
  • 2013-07-13
  • 2010-12-27
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
相关资源
最近更新 更多