在java中获取数百万条记录

use*_*165 5 java hibernate jdbc

非常开放的问题,我需要编写一个 java 客户端,从 Oracle 数据库中读取数百万条记录(比如说帐户信息)。将其转储为 XML 并通过网络服务将其发送给供应商。

执行此操作的最优化方法是什么?从获取数百万条记录开始。我去了 JPA/hibernate 路线,我在获取 200 万条记录时遇到了 outofMemory 错误。

JDBC 是更好的方法吗?获取每一行并随时构建 XML?还有其他选择吗?

我不是 Java 专家,因此不胜感激任何指导。

San*_*osh 5

我们曾经遇到过类似的问题,我们的记录大小超过了 2M。我们就是这样接近的。

  • 使用任何 OR 映射工具都被简单地排除了,因为像创建大型 POJO 这样的开销很大,如果要将数据转储到 XML,则基本上不需要。

  • 普通的 JDBC 是要走的路。这样做的主要优点是它返回一个ResultSet实际上并不一次包含所有结果的对象。因此,解决了将整个数据加载到内存中的问题。数据在我们迭代时加载ResultSet

  • 接下来是创建 XML 文件。我们创建一个 XML 文件并在Append 模式下打开。

  • 现在在我们迭代Resultset对象的循环中,我们创建 XML 片段,然后将其附加到 XML 文件。这一直持续到整个Resultset迭代。

  • 最终我们拥有的是 XML 文件将所有的记录。

  • 现在为了共享这个文件,我们创建了一个网络服务,如果文件可用,它会返回这个 XML 文件(存档/压缩)的 URL。

  • 在此之后,客户端可以随时下载此文件。

  • 请注意,这不是同步系统,这意味着该文件在客户端进行调用后不会变得可用。由于创建 XML 调用需要大量时间,因此 HTTP 通常会超时,因此采用这种方法。

只是一种您可以从中获取线索的方法。希望这可以帮助。


Cor*_*all 1

对于这种大小的数据,您可能可以使用更多内存来启动 java。检查使用-Xmx-Xms何时启动 Java。

如果您的数据确实太大而无法放入内存,但又不足以保证对不同技术的投资,请考虑分块操作。这必须立即完成吗?您能否将数据分成 10 个块并独立处理每个块?如果必须一次性完成,您是否可以从数据库流式传输数据,然后将其流式传输到文件中,而忘记已完成的事情(以保持 JVM 中的内存使用量较低)?