2011-06-09 35 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等)。

它可能比发布静态文件更清洁,但如果性能至关重要,静态文件可能会更好。

相关问题