问题描述
做项目时,偶然碰到的一次关闭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驱动。
网友评论