Tomcat 连接池废弃问题
Tomcat Connection Pool abandoned issue
我正在努力处理 Tomcat 连接池 error.The 下面的错误是在 运行 生成字符串值的简单存储过程之后在运行时抛出的。
WARNING: Connection has been abandoned PooledConnection[ConnectionID:45 ClientConnectionId: 7817280c-3f7e-4239-a009-3aedd0a855e8]:java.lang.Exception
at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1096)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:799)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:648)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:200)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
at util.ThreadLocalUtil.getConnection(ThreadLocalUtil.java:55)
at webapp.dao.WebApplicationDAO.getConnection(WebApplicationDAO.java:30)
at webapp.dao.AccountDAO.generateAccountId(AccountDAO.java:827)
at webapp.bo.Account.generateUserAccountId(Account.java:285)
at webapp.actions.AddUserAccountUNZAction.execute(AddUserAccountUNZAction.java:79)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
我对该错误的了解是连接已打开但未关闭。 运行帐户dao中的存储过程时打开连接。下面是调用存储过程的代码块。
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.prepareCall(sqlWebAppGenerateUserId);
stmt.setString(1, base);
rs = stmt.executeQuery();
String res = null;
if (rs.next()) {
res = rs.getString(1);
}
if (res == null) {
throw new RuntimeException("Failed to generate user id.");
}
return res;
} catch (SQLException e) {
LOG.error("{}", e);
throw new RuntimeException(e);
}finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
LOG.error(e.getMessage(), e);
}
}
if (rs != null) {
try {
rs.close();
conn.close();
} catch (SQLException e) {
LOG.error(e.getMessage(), e);
}
}
}
如您所见,我正在使用 finally 块来关闭连接等。
我无法解释仍然抛出错误的原因以及如何调试和解决此问题。任何帮助将不胜感激
只有在 rs != null
时才关闭 conn
,这意味着每次查询失败时连接都不会关闭。
我还建议切换到 try-with-resources 而不是编写笨拙的 finally 块,这可能会导致错误。
@Kayaman 说的。此外,如果语句执行时间超过 removeAbandonedTimeout
,则可能会发生这种情况。
@Kayaman 和@Gorazd 感谢您的建议。 tomcat lib 文件夹中缺少 jar 文件的问题。更具体地说 mail-1.4.jar.
由于缺少该jar 文件,发送电子邮件的功能失败。在调用发送邮件之前,connection.autocommit 设置为 true。邮件发送后,它会将 autocommit 设置回 false。这对我来说看起来像是被遗弃的错误发生的地方。
查看日志文件时发现邮件发送错误。这实际上是真正的错误,而被遗弃的错误可以被视为转移注意力。
我正在努力处理 Tomcat 连接池 error.The 下面的错误是在 运行 生成字符串值的简单存储过程之后在运行时抛出的。
WARNING: Connection has been abandoned PooledConnection[ConnectionID:45 ClientConnectionId: 7817280c-3f7e-4239-a009-3aedd0a855e8]:java.lang.Exception
at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1096)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:799)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:648)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:200)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
at util.ThreadLocalUtil.getConnection(ThreadLocalUtil.java:55)
at webapp.dao.WebApplicationDAO.getConnection(WebApplicationDAO.java:30)
at webapp.dao.AccountDAO.generateAccountId(AccountDAO.java:827)
at webapp.bo.Account.generateUserAccountId(Account.java:285)
at webapp.actions.AddUserAccountUNZAction.execute(AddUserAccountUNZAction.java:79)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
我对该错误的了解是连接已打开但未关闭。 运行帐户dao中的存储过程时打开连接。下面是调用存储过程的代码块。
Connection conn = null;
CallableStatement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.prepareCall(sqlWebAppGenerateUserId);
stmt.setString(1, base);
rs = stmt.executeQuery();
String res = null;
if (rs.next()) {
res = rs.getString(1);
}
if (res == null) {
throw new RuntimeException("Failed to generate user id.");
}
return res;
} catch (SQLException e) {
LOG.error("{}", e);
throw new RuntimeException(e);
}finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
LOG.error(e.getMessage(), e);
}
}
if (rs != null) {
try {
rs.close();
conn.close();
} catch (SQLException e) {
LOG.error(e.getMessage(), e);
}
}
}
如您所见,我正在使用 finally 块来关闭连接等。
我无法解释仍然抛出错误的原因以及如何调试和解决此问题。任何帮助将不胜感激
只有在 rs != null
时才关闭 conn
,这意味着每次查询失败时连接都不会关闭。
我还建议切换到 try-with-resources 而不是编写笨拙的 finally 块,这可能会导致错误。
@Kayaman 说的。此外,如果语句执行时间超过 removeAbandonedTimeout
,则可能会发生这种情况。
@Kayaman 和@Gorazd 感谢您的建议。 tomcat lib 文件夹中缺少 jar 文件的问题。更具体地说 mail-1.4.jar.
由于缺少该jar 文件,发送电子邮件的功能失败。在调用发送邮件之前,connection.autocommit 设置为 true。邮件发送后,它会将 autocommit 设置回 false。这对我来说看起来像是被遗弃的错误发生的地方。
查看日志文件时发现邮件发送错误。这实际上是真正的错误,而被遗弃的错误可以被视为转移注意力。