use*_*165 5 java hibernate jdbc
非常开放的问题,我需要编写一个 java 客户端,从 Oracle 数据库中读取数百万条记录(比如说帐户信息)。将其转储为 XML 并通过网络服务将其发送给供应商。
执行此操作的最优化方法是什么?从获取数百万条记录开始。我去了 JPA/hibernate 路线,我在获取 200 万条记录时遇到了 outofMemory 错误。
JDBC 是更好的方法吗?获取每一行并随时构建 XML?还有其他选择吗?
我不是 Java 专家,因此不胜感激任何指导。
我们曾经遇到过类似的问题,我们的记录大小超过了 2M。我们就是这样接近的。
使用任何 OR 映射工具都被简单地排除了,因为像创建大型 POJO 这样的开销很大,如果要将数据转储到 XML,则基本上不需要。
普通的 JDBC 是要走的路。这样做的主要优点是它返回一个ResultSet实际上并不一次包含所有结果的对象。因此,解决了将整个数据加载到内存中的问题。数据在我们迭代时加载ResultSet
接下来是创建 XML 文件。我们创建一个 XML 文件并在Append 模式下打开。
现在在我们迭代Resultset对象的循环中,我们创建 XML 片段,然后将其附加到 XML 文件。这一直持续到整个Resultset迭代。
最终我们拥有的是 XML 文件将所有的记录。
现在为了共享这个文件,我们创建了一个网络服务,如果文件可用,它会返回这个 XML 文件(存档/压缩)的 URL。
在此之后,客户端可以随时下载此文件。
请注意,这不是同步系统,这意味着该文件在客户端进行调用后不会变得可用。由于创建 XML 调用需要大量时间,因此 HTTP 通常会超时,因此采用这种方法。
只是一种您可以从中获取线索的方法。希望这可以帮助。
对于这种大小的数据,您可能可以使用更多内存来启动 java。检查使用-Xmx和-Xms何时启动 Java。
如果您的数据确实太大而无法放入内存,但又不足以保证对不同技术的投资,请考虑分块操作。这必须立即完成吗?您能否将数据分成 10 个块并独立处理每个块?如果必须一次性完成,您是否可以从数据库流式传输数据,然后将其流式传输到文件中,而忘记已完成的事情(以保持 JVM 中的内存使用量较低)?
| 归档时间: |
|
| 查看次数: |
14696 次 |
| 最近记录: |