2010-12-02 57 views
3

我通過休息服務返回大量數據。該查詢返回約200,000行數據,然後轉換爲XML。當我在IE8中運行此服務時,出現「存儲空間不足以完成此操作」的錯誤。Jersey Jax-RS的內存錯誤

有沒有這種方式返回大量數據的最佳做法?

數據庫在大約5秒內運行查詢,所以我猜測問題是JAXB將它轉換爲xml。

有沒有人有任何想法來改善這一點?

回答

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更多信息,請參見: