java - Tomcat连接池废弃问题

标签 java tomcat jdbc tomcat7

我正在努力解决 Tomcat 连接池错误。在运行生成字符串值的简单存储过程后,在运行时会抛出以下错误。

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 block 来关闭连接等。

我无法解释仍然抛出错误的原因以及如何调试和解决此问题。任何帮助将不胜感激

最佳答案

仅当 rs != null 时才关闭 conn,这意味着每次查询失败时连接都不会关闭。

我还建议切换到 try-with-resources而不是编写可能导致错误的笨拙的 finally block 。

关于java - Tomcat连接池废弃问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47435740/

相关文章:

java - 打印对话框不允许在 selenium 中执行下一个代码

java - 从 Tomcat 上的相对路径读取文件

java - 如何在 j2ee webapp 中提供文件下载

java - 如何使用 Spring 配置 UCanAccess JDBC 驱动程序?

java - 如何将数组的值添加到一个矩阵的列?

Java Server Faces Ajax 请求无法正常工作

java - 如何在取消部署应用程序时清除 Tomcat 日志

sql - JDBC 插入实数组

java - 无法在 MySql JDBC 中获取自动生成的 ID

java - JDesktopPane 放置