探究关闭JtdsResultSet耗时长的问题

问题描述

做项目时,偶然碰到的一次关闭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驱动。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JDBC基础知识 一、采用JDBC访问数据库的基本步骤: A.载入JDBC驱动程序 B.定义连接URL ...
    java日记阅读 3,911评论 0 20
  • 本节介绍Statement接口及其子类PreparedStatement和CallableStatement。 它...
    zlb阅读 1,194评论 0 0
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,034评论 2 89
  • 王建军 自打教师节设立以来,他已经走过了34年。 明天,星期一,9月10号,就是2018年教师节了。 1994年9...
    东营王建军阅读 591评论 4 2
  • 我的手与庄稼十指相牵 从门前的香椿树到河边的韭菜园 一路芬芳 风偏着耳朵听 我与庄稼开启了多深的果实 苦苣菜幸福成...
    诗意与河流阅读 357评论 4 10