【发布时间】:2017-03-05 04:40:24
【问题描述】:
我有这个要求来迭代结果集中返回的数百万条记录并处理它们并将它们存储在一些数据结构中。我还没有找到任何相关的例子或参考。 JOOQ 似乎正在做一些我可能想要的事情,但它似乎不是免费的。我希望如果使用 java 8 流我可以实现它,但没有示例或文章似乎给了我任何前进的方向。我也对其他选择持开放态度。
基于此 SO 参考:resultset parallel 我确实在下面尝试过,但它没有给我任何性能改进,如下面的性能指标所示。
代码:
顺序迭代:
while(rs.next()) {
System.out.println(rs.getString(1));
}
使用流和拆分器:
Stream<String> s = StreamSupport.stream(new Spliterators.AbstractSpliterator<String>(Long.MAX_VALUE,
Spliterator.ORDERED) {
@Override
public boolean tryAdvance(Consumer<? super String> action) {
try {
if (!rs.next())
return false;
action.accept(rs.getString(1));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}, true);
s.forEach(System.out::println);
记录总数:3759
顺序花费的时间:~ 83.8 秒
Streams 花费的时间:~ 83.5 秒
谁能查看这个并告诉我我是否没有正确实现流。
【问题讨论】:
-
也许这个问题和答案会有所帮助:stackoverflow.com/a/32232173/4105457
-
我在连接您的标题和问题时遇到了问题。
-
结果集处理示例太多了,我猜你的问题出在其他地方?我认为您应该能够使您的问题更加具体。目前,我认为答案还不清楚。
-
@Flown 早些时候,我确实尝试了您在上面建议的 SO 参考中给出的解决方案。但这并没有带来任何性能提升。用我尝试过的代码和结果更新了 OP。
-
请注意,如果您使用开源数据库,jOOQ 是免费的。并行处理对流有一些开销,并且 JDBC 驱动程序将执行大量同步以使连接线程安全,这可能会使您的代码串行化;您可能需要考虑在单个线程上从数据库中检索值,然后才将其并行化。
标签: java jdbc java-8 java-stream resultset