Java 拆分JDBC Oracle结果集以避免OOM错误

Java 拆分JDBC Oracle结果集以避免OOM错误,java,oracle,memory,jdbc,Java,Oracle,Memory,Jdbc,我有一个通过JDBC连接到oracle数据库并提取300多万条记录的程序。如果我将所有内容都加载到内存中,则会出现内存不足错误。我想将数据加载到内存中的50000个部分 我处理这个问题有两种方式: a) 保持连接打开,并将来自结果集的50 0000个数据分组处理。 我真的不喜欢这种方法,因为当一切都完成时,连接可能会保持打开状态,而且在处理每组50000条记录时,连接可能会打开很长时间(有超时和减少连接池的风险)(通过被处理,我的意思是,根据可能需要的派生数据,这些连接中的每一个都可能导致其他连

我有一个通过JDBC连接到oracle数据库并提取300多万条记录的程序。如果我将所有内容都加载到内存中,则会出现内存不足错误。我想将数据加载到内存中的50000个部分

我处理这个问题有两种方式: a) 保持连接打开,并将来自结果集的50 0000个数据分组处理。 我真的不喜欢这种方法,因为当一切都完成时,连接可能会保持打开状态,而且在处理每组50000条记录时,连接可能会打开很长时间(有超时和减少连接池的风险)(通过被处理,我的意思是,根据可能需要的派生数据,这些连接中的每一个都可能导致其他连接快速打开和关闭) b) 处理基于行号,但我不确定如果底层数据发生变化会产生什么影响,而且我真的不能每次处理50000条记录时都进行排序


这似乎是一个常见的问题,我想知道解决这个问题的一些行业标准/最佳方法/设计模式。

如果您需要一个跨越整个读取的持久事务(也就是您提到的没有人从您下面更改数据),您可能需要研究将此问题转移到rdbms,并将其编码为一个存储过程,您可以从jdbc/jpa/任何地方调用它

我知道它不能从java方面解决问题,但有时移动问题是正确的解决方案,这取决于上下文和细节


cheers

据我所知,Oracle默认情况下不会将所有获取的行保留在内存中。您是否碰巧使用了可滚动的结果集而不是仅使用“前进”类型?还是您自己在内存中存储了那么多?没错,oracle并没有将所有内容都保存在内存中,它们由ResultSet对象引用。但是为了保持对resultset项目的引用,我需要在java中保持连接的打开,我想知道是否有比保持连接打开更好的方法。如果我自己将所有内容加载到内存中,我将保证内存不足。我会假设您的程序将所有内容都保留在内存中(或者没有正确释放处理过的数据)。我已经通过JDBC成功导出了1亿行,甚至没有增加默认堆大小。