JDBC中setFetchSize()方法行为不符预期的问题咨询
问题分析与解决
你确实误解了setFetchSize()在SQL Server JDBC驱动中的作用,驱动的默认行为也和你的预期不符,具体原因和解决方式如下:
1. SQL Server JDBC驱动的默认行为
默认情况下,SQL Server JDBC驱动的selectMethod属性值为direct——这意味着执行executeQuery()时,驱动会一次性把整个结果集的所有数据拉取到客户端本地内存,不管你设置了多大的fetchSize。
这就是你断开VPN后仍能处理完全部50行的核心原因:所有数据已经提前存到本地了,后续遍历ResultSet根本不需要再和服务器通信。
2. 让setFetchSize()实现分批拉取的正确方式
要让setFetchSize()生效,你需要修改JDBC连接配置,加上两个关键设置:
- 将连接属性
selectMethod设为cursor - 确保
fetchSize设置为大于0的数值
比如你的连接URL可以改成这样:
jdbc:sqlserver://远程服务器地址:端口;databaseName=数据库名;selectMethod=cursor;
修改后驱动会采用游标模式,每次只拉取fetchSize指定行数的数据到本地;当你遍历完这批数据后,调用resultSet.next()时才会向服务器请求下一批数据。这时再做你之前的测试,处理完10行后,因为VPN断开,后续拉取数据时就会抛出连接错误,符合你的预期。
3. 额外建议:如果需求是分页查询
如果你真正的目标是分页获取数据(比如只取第1页10行、第2页10行,而非分批拉取全部数据),更推荐用SQL层面的分页语法,服务器只会返回你需要的那一页数据,性能更优。比如SQL Server的分页写法:
SELECT id, name FROM 你的表名 ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
(OFFSET后的数字是跳过的行数,FETCH NEXT后的数字是每页行数,比如第2页就把OFFSET设为10)
内容的提问来源于stack exchange,提问作者Prasad Parab
相关产品推荐
相关产品推荐

