在 Glassfish4 和 Ubuntu 14.04 上部署后我遇到的一个严重问题。在java中,由于某些原因我没有使用hibernate。我手动获取结果集作为查询结果,将结果集发送到 JSP 页面并迭代它。
问题是,我已将finally block 设置如下:
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();
}
}
因为我通过 session 将结果集发送到 JSP 页面,所以我将在 JSP 页面上关闭结果,如下所示:
if(resultset!=null) resultset.close();
现在,问题是,几分钟后我的应用程序开始给出异常,表明已使用最大连接池。
我应该怎样做才能避免异常?
最佳答案
当前的finally block 的问题是:
如果关闭命令之一抛出任何异常,则不会运行以下命令。由于问题似乎是资源泄漏,因此这可能是原因。
如果您在JDK7+下运行并且资源是可自动关闭的,请尝试使用
try(Connection conn=DriverManager.getConnection();
Statement stat=conn.createStatement){
}
然后资源将安全地关闭并退出 try block 。
如果您需要从finally block 中关闭资源,请尝试为每个close语句包装一个try catch。
对于关闭资源的顺序,请始终先关闭您稍后创建的资源。
关于java - Ubuntu 上的 Glassfish JDBC 连接池问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156035/