2011-03-07 43 views
3

我们有一个应用程序,其中从存储的proc结果集创建XML字符串,并使用XSLT进行转换以返回到调用的servlet。这项工作适用于较小的数据集,但会导致大量数据出现内存不足错误。在这种情况下,理想的解决方案是什么?从结果集输出较大的xml

+0

多大? 10Mb或10Gb?它的确有所作为。你提到servlets:所以它是Java。你确定你已经为Java VM分配了足够的内存吗?默认值非常小。 – 2011-03-07 08:48:36

回答

1

如果您正在处理整个XML文档,那么听起来好像您需要为Java堆分配更多内存。但是,这只适用于定义的最大堆大小。你知道一个合理的最大数据集大小还是无界的?

为什么你需要数据库来生成XML?

+0

输出是存储过程调用的结果。代码将遍历结果集并创建XML。它是无限的。 – joesam232 2011-03-07 02:34:07

+0

然后去@ Edward的解决方案。 – Jeremy 2011-03-07 02:38:50

3

XSLT转换通常需要将整个数据集加载到内存中,因此最简单的方法是获取更多内存。

如果您可以重写您的XSLT,那么XML的流转换允许增量处理数据。

1

几件重要的事情要注意。

您提到的功能在功能上与小型数据集功能相当,但会因内存较大而丢失数据。您需要确定是否创建导致内存不足或在同一进程中传输数据集的数据集。

你正在做的事情是让很多对象留在记忆中。重新检查你的代码并在使用后明确地废除一些对象。这将使垃圾收集器的生活更轻松。使用JVM的MaxPermSize设置。这将为您提供额外的字符串空间。

这种方法将会有一个限制,即使您能够为单个用户传输大型数据集,也可能会为多个用户使用OMeMemory。

一个可能适合你的建议。

  • 在Asyncronous过程中解决这个问题。创建大型数据集,分离进程和下载数据集的过程不同。

  • 使数据集可供下载时,您可以很好地控制使用基于流的下载的内存消耗。