2011-06-09 36 views
3

我正在嘗試爲包含數千頁網頁的大型網站動態地生成站點地圖。wicket:如何從數據庫流式傳輸資源

是的,我已經考慮過離線生成站點地圖文件,並且只是靜態地提供站點地圖文件,我最終可能會這樣做。但我認爲這是一個普遍有用的問題:

如何從Wicket中的數據流流大型數據?

我按照Wicket SEO page的說明操作,並能夠使用DataProvider獲得動態站點地圖實現。但是它不會縮放 - 當它調用我的DataProvider的iterator()方法時,它的內存耗盡,count參數等於我返回的對象的總數,而不是以塊的形式迭代它們。

我認爲解決方案存在於WebResource/ResourceStreamingRequestTarget的某處。但是這些類需要IResourceStream,最終歸結爲提供了一個InputStream實現,該實現以字節爲單位進行處理,而不是數據庫記錄。在這種情況下,我不知道如何實現length()方法,因爲這需要提前訪問每條記錄來計算總長度。

回答

0

最後我用一個AbsractResourceStreamWriter子類:

public class SitemapStreamWriter extends AbstractResourceStreamWriter 
{ 
    @Override 
    public void write(OutputStream output) 
    { 
     String HEAD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
         "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n" + 
         "  xmlns:wicket=\"http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd\">\n"; 
     try 
     { 
      output.write(HEAD.getBytes()); 

      // write out a <loc> entry for each of my pages here 

      output.write("</urlset>\n".getBytes()); 
     } 
     catch (IOException e) 
     { 
      throw new RuntimeException(e.getMessage(), e); 
     } 
    } 
} 
1

從IResourceStream.length的文檔()方法:

/** 
* Gets the size of this resource in bytes 
* 
* TODO 1.5: rename to lengthInBytes() or let it return some sort of size object 
* 
* @return The size of this resource in the number of bytes, or -1 if unknown 
*/ 
long length(); 

因此,我認爲,如果你的IResourceStream執行告訴長度是未知的,你直接流中的數據,你拿到這將是確定來自數據庫的記錄。

0

您可以返回-1,表示未知長度,或者可以在將結果呈現給客戶端之前將結果寫入內存緩衝區或磁盤。

您也可以將此文件用作緩存,以便每次請求此資源時不需要重新生成它(請記住,您必須處理併發請求)。也可以考慮專用的緩存解決方案(例如,memcache,ehcache等)。

它可能比發佈靜態文件更清潔,但如果性能至關重要,靜態文件可能會更好。

相關問題