探究关闭JtdsResultSet耗时长的问题

2018-12-21  本文已影响0人  血色彼岸花_703d

问题描述

做项目时,偶然碰到的一次关闭ResultSet时特别慢,经过一些列排除,仅当我对SqlServer操作时出现的问题。因为连接Sqlserver使用的是Jtds驱动,主要是为了设置网络超时间,官方的Sqlserver是无法设置的。使用PrepareStatement进行查询,返回结果是ResultSet,此次查询的数据量很大,大概3000万条数据,在未对结果集中的数据进行遍历时,因为业务场景中另一部分出现问题,现在需要关闭ResultSet,此时调用close()方法。按照正常的情况,Resultset会立即被释放,并不会消耗很长时间,但由于使用的是jtds驱动,会调用ResultSet的子类JtdsResultSet中的close()方法。

JtdsResultSet.close()实现


public void close() throws SQLException {
    if (!this.closed) {
        try {
            if (!this.getConnection().isClosed()) {
                while(true) {
                    if (this.next()) {
                        continue;
                    }
                }
            }
        } finally {
            this.closed = true;
            this.statement = null;
        }
    }
}

从上述代码中可以看出当JtdsResultSet.close()时,会遍历剩余的所有结果集,这需要耗费相当多的时间和资源进行处理,显然这种设计缺陷性很大,而且与官方对关闭ResultSet的解释有所冲突。

总结

目前暂无特别好的方法来处理这种因jtds驱动所引发的ResultSet关闭耗时的问题,期待官方解决,或者不使用jtds驱动。

上一篇 下一篇

猜你喜欢

热点阅读