休憩サービスで大量のデータを返送しています。クエリは約200,000行のデータを返し、XMLに変換されます。 IE8でこのサービスを実行すると、「この操作を完了するのに十分な記憶域がない」というエラーが表示されます。ジャージーJax-RSのメモリエラー
大量のデータをこのように返すベストプラクティスはありますか?
データベースは約5秒でクエリを実行するので、問題はJAXBがxmlに変換していると推測しています。
これを改善するアイデアはありますか?
休憩サービスで大量のデータを返送しています。クエリは約200,000行のデータを返し、XMLに変換されます。 IE8でこのサービスを実行すると、「この操作を完了するのに十分な記憶域がない」というエラーが表示されます。ジャージーJax-RSのメモリエラー
大量のデータをこのように返すベストプラクティスはありますか?
データベースは約5秒でクエリを実行するので、問題はJAXBがxmlに変換していると推測しています。
これを改善するアイデアはありますか?
問題
私はあなたが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のの詳細については、参照してください: