2010-12-02 6 views
3

休憩サービスで大量のデータを返送しています。クエリは約200,000行のデータを返し、XMLに変換されます。 IE8でこのサービスを実行すると、「この操作を完了するのに十分な記憶域がない」というエラーが表示されます。ジャージーJax-RSのメモリエラー

大量のデータをこのように返すベストプラクティスはありますか?

データベースは約5秒でクエリを実行するので、問題はJAXBがxmlに変換していると推測しています。

これを改善するアイデアはありますか?

答えて

1

問題

私はあなたがJAXBによって処理できるオブジェクトとしてデータを取得するためにJPAを使用していると仮定しています。このような場合、JPAオブジェクトは遅延ロードを使用している可能性があります。つまり、問合せによってすべてのデータが一度に実現されるわけではありません。しかし、JAXB実装がオブジェクトグラフを横断するにつれて、あなたがなくなるまで、より多くのものがメモリに持ち込まれます。

オプション#1から

一つのアプローチは、以下のいずれかのようURIをチャンクでデータを返し、提供することであるチャンクでデータを提供:

これらをパラメータはJPAクエリ設定と非常によく似ています。

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

オプション#2 - ではなく、あなたがより多くを得るためにリンクを提供することができ、すべてのデータを含めての、また、より多くのデータ

を取得するためのリンクを提供します。たとえば、代わりに:

次のように返すことができます。クライアントは、指定されたURIを使用して製品の詳細を要求できます。 JAXBでこれをXmlAdapterを使用してマップできます。

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

XmlAdapterのの詳細については、参照してください: