开发者社区> 问答> 正文

Tomcat7 新连接池的关闭时抛出异常问题

试用了一下Tomcat7的新连接池,写一个用于相同线程间Dao对象共享连接的Filter时候遇到了一个比较奇怪的问题。总是过滤器在响应最后关闭connection时抛出异常:
java.sql.SQLException: Connection has already been closed.
主要代码如下

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        // 请求响应
        chain.doFilter(request, response);
    } finally { // 请求响应结束后关闭数据库连接
        try {
            close();
        } catch (SQLException e) {
            log.warn("SQLException: " + e.getMessage());
        }
    }
}
 
/**
 * 关闭并从ThreadLocal中清除和当前线程绑定的数据库连接
 * 
 * @throws SQLException
 */
public static void close() throws SQLException {
    Connection connection = connectionThreadLocal.get();
 
    if (connection != null) { // 如果存在数据库连接 就关闭并清除
        try {
            log.debug(connection.isClosed());
            connection.close();
        } finally {
            connectionThreadLocal.remove();
            log.debug("connection(" + connection.hashCode() + ") close");
        }
    }
}

试过应用自己创建DataSource和直接用Tomcat的数据源配置创建都有同样的问题。而且在调用connection的close()之前log.debug(connection.isClosed());输出都是false。不知道各位有没有遇到这个情况,知道原因的。

展开
收起
落地花开啦 2016-03-25 10:10:51 2362 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    连接被第一个线程关闭了,所以才会报这个异常

    2019-07-17 19:13:37
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Apache Tomcat 的云原生演进 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载