默认情况下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,不能共用一个
参考文章