Ubuntu 上的 Glassfish JDBC 连接池问题
Glassfish JDBC Connection Pooling Issue on Ubuntu
我在 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(结果集!=null) resultset.close();
现在,问题是,几分钟后我的应用程序开始出现异常,表明已使用最大连接池。
我应该怎么做才能避免异常?
您当前 finally 块的问题是:
如果关闭命令之一抛出任何异常,则以下命令将不会运行。由于问题似乎是资源泄漏,所以这可能是原因。
如果你在 JDK7+ 下 运行ning 并且资源是自动关闭的,请尝试使用
try(Connection conn=DriverManager.getConnection();
Statement stat=conn.createStatement){
}
然后资源将安全退出 try 块。
如果您需要从 finally 块中关闭资源,请尝试为每个关闭语句包装一个 try catch。
关于关闭资源的顺序,始终先关闭您稍后创建的资源。
我在 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(结果集!=null) resultset.close();
现在,问题是,几分钟后我的应用程序开始出现异常,表明已使用最大连接池。
我应该怎么做才能避免异常?
您当前 finally 块的问题是:
如果关闭命令之一抛出任何异常,则以下命令将不会运行。由于问题似乎是资源泄漏,所以这可能是原因。
如果你在 JDK7+ 下 运行ning 并且资源是自动关闭的,请尝试使用
try(Connection conn=DriverManager.getConnection();
Statement stat=conn.createStatement){
}
然后资源将安全退出 try 块。
如果您需要从 finally 块中关闭资源,请尝试为每个关闭语句包装一个 try catch。
关于关闭资源的顺序,始终先关闭您稍后创建的资源。