2010-12-02 39 views
3

Je renvoie une grande quantité de données via un service de repos. La requête renvoie environ 200 000 lignes de données puis est convertie en XML. Lorsque j'exécute ce service dans IE8, j'obtiens une erreur: "il n'y a pas assez de mémoire pour terminer cette opération".Erreur de mémoire avec Jersey Jax-RS

Existe-t-il une meilleure pratique pour renvoyer une grande quantité de données de cette façon?

La base de données a exécuté la requête en environ 5 secondes, donc je devine que le problème est que JAXB le convertit en xml.

Est-ce que quelqu'un a des idées pour améliorer cela?

Répondre

1

Le problème

Je suppose que vous utilisez JPA pour obtenir vos données sous forme d'objets qui peuvent être manipulés par JAXB. Si tel est le cas, les objets JPA peuvent utiliser un chargement paresseux, ce qui signifie qu'une requête peut ne pas réaliser toutes les données à la fois. Cependant, lorsque l'implémentation JAXB parcourt le graphe d'objets, de plus en plus d'entre eux sont mis en mémoire jusqu'à épuisement.

Option # 1 - Fournir les données dans Chunks

Une approche est de renvoyer vos données en morceaux et offrir un URI comme celui ci-dessous:

Ces les paramètres se lient très bien aux paramètres de requête JPA:

namedQuery.setFirstResult(10); 
namedQuery.setMaxResults(100); 

Option # 2 - Fournir des liens pour obtenir plus de données

Sinon, au lieu d'inclure toutes les données que vous pouvez fournir des liens pour obtenir plus. Par exemple au lieu de:

<purchase-order> 
    <product id="1"> 
     <name>...</name> 
     <price>...</price> 
     ... 
    </product> 
    <product id="2"> 
     <name>...</name> 
     <price>...</price> 
     ... 
    </product> 
    ... 
</purchase-order> 

Vous pouvez retourner ce qui suit, le client peut alors demander des détails sur les produits en utilisant l'URI fourni. Vous pouvez mapper ceci dans JAXB en utilisant un XmlAdapter.

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

Pour plus d'informations sur XMLAdapter voir: