Java Tomcat连接池已放弃问题

Java Tomcat连接池已放弃问题,java,tomcat,jdbc,tomcat7,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.ge

我正在处理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块来关闭连接等


我无法解释为什么仍然抛出错误,以及如何调试和解决此问题。只有在
rs!=null
,表示每次查询失败时,连接都不会关闭


我还建议切换到,而不是编写可能导致错误的笨拙的finally块。

只有在
rs!=null
,表示每次查询失败时,连接都不会关闭


我还建议切换到,而不是编写可能导致bug的笨拙的finally块。

What@Kayaman说的。此外,如果语句执行时间长于RemoveBandonedTimeout,则可能发生这种情况。

正如@Kayaman所说。此外,如果语句执行时间超过RemoveBandonedTimeout,则可能发生这种情况。

@Kayaman和@Gorazd感谢您的建议。tomcat lib文件夹中缺少jar文件的问题。更具体地说,是mail-1.4.jar

由于缺少此jar文件,发送电子邮件的功能失败。在调用发送邮件之前,connection.autocommit设置为true。邮件发送后,它将自动提交设置回false。在我看来,这就像是被抛弃的错误发生的地方


在查看日志文件时,我发现邮件发送错误。事实上,这才是真正的错误,而被抛弃的错误可以被看作是一种转移注意力的手段

@Kayaman和@Gorazd感谢您的建议。tomcat lib文件夹中缺少jar文件的问题。更具体地说,是mail-1.4.jar

由于缺少此jar文件,发送电子邮件的功能失败。在调用发送邮件之前,connection.autocommit设置为true。邮件发送后,它将自动提交设置回false。在我看来,这就像是被抛弃的错误发生的地方

在查看日志文件时,我发现邮件发送错误。事实上,这才是真正的错误,而被抛弃的错误可以被看作是一种转移注意力的手段

首先,开始使用。如果完成后你仍然有问题,发布一个新问题。对于初学者,开始使用。如果在这样做之后你仍然有问题,发布一个新的问题。