【发布时间】:2010-12-02 15:34:12
【问题描述】:
我正在通过休息服务返回大量数据。该查询返回大约 200,000 行数据,然后转换为 XML。当我在 IE8 中运行此服务时,我收到“没有足够的存储空间来完成此操作”的错误。
有没有以这种方式返回大量数据的最佳实践?
数据库在大约 5 秒内运行查询,所以我猜测问题是 JAXB 将其转换为 xml。
有没有人有任何改进的想法?
【问题讨论】:
我正在通过休息服务返回大量数据。该查询返回大约 200,000 行数据,然后转换为 XML。当我在 IE8 中运行此服务时,我收到“没有足够的存储空间来完成此操作”的错误。
有没有以这种方式返回大量数据的最佳实践?
数据库在大约 5 秒内运行查询,所以我猜测问题是 JAXB 将其转换为 xml。
有没有人有任何改进的想法?
【问题讨论】:
问题
我假设您正在使用 JPA 将数据作为可以由 JAXB 处理的对象来获取。如果是这种情况,JPA 对象可能正在使用延迟加载,这意味着查询可能不会一次实现所有数据。然而,随着 JAXB 实现遍历对象图,越来越多的对象被带入内存,直到用完为止。
选项 #1 - 以块的形式提供数据
一种方法是分块返回数据并提供如下所示的 URI:
这些参数非常适合 JPA 查询设置:
namedQuery.setFirstResult(10);
namedQuery.setMaxResults(100);
选项 #2 - 提供链接以获取更多数据
或者,您可以提供链接以获得更多数据,而不是包含所有数据。例如,而不是:
<purchase-order>
<product id="1">
<name>...</name>
<price>...</price>
...
</product>
<product id="2">
<name>...</name>
<price>...</price>
...
</product>
...
</purchase-order>
您可以返回以下内容,然后客户端可以使用提供的 URI 请求产品的详细信息。您可以使用 XmlAdapter 在 JAXB 中映射它。
<purchase-order>
<product>http://www.example.com/products/1</product>
<product>http://www.example.com/products/2</product>
...
</purchase-order>
有关 XmlAdapter 的更多信息,请参阅:
【讨论】: