【问题标题】:Memory error with Jersey Jax-RSJersey Jax-RS 的内存错误
【发布时间】:2010-12-02 15:34:12
【问题描述】:

我正在通过休息服务返回大量数据。该查询返回大约 200,000 行数据,然后转换为 XML。当我在 IE8 中运行此服务时,我收到“没有足够的存储空间来完成此操作”的错误。

有没有以这种方式返回大量数据的最佳实践?

数据库在大约 5 秒内运行查询,所以我猜测问题是 JAXB 将其转换为 xml。

有没有人有任何改进的想法?

【问题讨论】:

    标签: jaxb jersey jax-rs


    【解决方案1】:

    问题

    我假设您正在使用 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 的更多信息,请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多