jdbc_fetchSize

探讨了在大数据量查询场景下,pgjdbcdriver默认一次性拉取所有结果集导致的OOM问题,通过设置fetchSize为Integer.MIN_VALUE实现流式查询,有效避免内存溢出。并对比了MySQL环境下流式与非流式查询对数据库连接的影响,揭示了流式查询下连接复用的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下pgjdbc driver会一次性拉取所有结果集,也就是在executeQuery的时候。对于大数据量的查询来说,非常容易造成OOM。这种场景就需要设置fetchSize,执行query的时候先返回第一批数据,之后next完一批数据之后再去拉取下一批。

//设置流式
ps.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = ps.executeQuery(); 

MySQL

做了个小实验,用mysql,同一个数据库连接,进行多次查询获取多个ResultSet之后,开始模拟结果集合并,调用各个resultSet的next方法。
a)流式查询(preparedStatement.setFetchSize(Ingeter.MINVALUE))会报错,连接被其中一个resultSet占用,无法被复用;
b)非流式查询,可以正常执行

这也就能解释,ZDAL2为何能在同一个数据库connection中拿到多个resultSet,再做结果集合并了。
而sharding-sphere由于做的是流式查询,需要每个结果集单独使用一个Connection,不能共用一个

参考文章

https://www.jianshu.com/p/998099e364b2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值