Ошибка памяти с Джерси Jax-RS - PullRequest
       3

Ошибка памяти с Джерси Jax-RS

3 голосов
/ 02 декабря 2010

Я возвращаю большое количество данных через службу отдыха. Запрос возвращает около 200 000 строк данных, а затем преобразуется в XML. Когда я запускаю этот сервис в IE8, я получаю сообщение об ошибке «недостаточно места для выполнения этой операции».

Есть ли лучшая практика для возврата большого количества данных таким способом?

База данных запускает запрос примерно за 5 секунд, поэтому я предполагаю, что проблема в том, что JAXB преобразует его в xml.

У кого-нибудь есть идеи по улучшению этого?

1 Ответ

1 голос
/ 02 декабря 2010

Проблема

Я предполагаю, что вы используете JPA для получения ваших данных как объектов, которые могут обрабатываться JAXB.В этом случае объекты JPA могут использовать ленивую загрузку, что означает, что запрос может не реализовать все данные одновременно.Однако по мере того, как реализация JAXB пересекает граф объектов, все больше и больше его заносится в память до тех пор, пока вы не закончите.Один из подходов состоит в том, чтобы вернуть ваши данные в виде блоков и предложить 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.Вы можете отобразить это в JAXB, используя XmlAdapter.

<purchase-order>
    <product>http://www.example.com/products/1</product>
    <product>http://www.example.com/products/2</product>
    ...
</purchase-order>

Для получения дополнительной информации о XmlAdapter см .:

...