Stream wicket:如何从数据库流式传输资源
我正在尝试为一个包含数千页的大型网站动态生成站点地图 是的,我已经考虑过离线生成站点地图文件,并简单地静态地为其提供服务,我可能最终会这样做。但我认为这是一个普遍有用的问题: 如何从Wicket中的数据库中传输大数据? 我按照当时的说明进行操作,并能够使用数据提供程序实现动态站点地图。但是它不能扩展—当它调用我的DataProvider的Stream wicket:如何从数据库流式传输资源,stream,streaming,wicket,Stream,Streaming,Wicket,我正在尝试为一个包含数千页的大型网站动态生成站点地图 是的,我已经考虑过离线生成站点地图文件,并简单地静态地为其提供服务,我可能最终会这样做。但我认为这是一个普遍有用的问题: 如何从Wicket中的数据库中传输大数据? 我按照当时的说明进行操作,并能够使用数据提供程序实现动态站点地图。但是它不能扩展—当它调用我的DataProvider的迭代器()方法时,它的内存不足,而countarg等于我返回的对象总数,而不是分块对它们进行迭代 我认为解决方案存在于WebResource/ResourceS
迭代器()
方法时,它的内存不足,而count
arg等于我返回的对象总数,而不是分块对它们进行迭代
我认为解决方案存在于
WebResource/ResourceStreamingRequestTarget
中。但是这些类需要一个IResourceStream
,它最终归结为提供一个InputStream
实现,它以字节而不是DB记录处理。在这种情况下,我不知道如何实现length()
方法,因为这需要提前访问每条记录以计算总长度。来自IResourceStream的文档。length()方法:
因此,我认为如果您的IResourceStream实现告诉您长度未知,您可以在从数据库获取记录时直接流式传输数据。您可以返回-1,表示未知长度,或者您可以在将结果呈现给客户端之前将其写入内存缓冲区或磁盘 您还可以将此文件用作缓存,这样您就不必在每次请求此资源时都重新生成它(请记住,您必须处理并发请求)。还可以考虑专用缓存解决方案(如memcache、ehcache等)
它可能比发布静态文件更干净,但如果性能至关重要,静态文件可能会更好。我最终使用了
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);
}
}
}
公共类SitemapStreamWriter扩展了AbstractResourceStreamWriter
{
@凌驾
公共无效写入(OutputStream输出)
{
字符串头=“\n”+
“\n”;
尝试
{
output.write(HEAD.getBytes());
//在这里为我的每一页写一个条目
output.write(“\n”.getBytes());
}
捕获(IOE异常)
{
抛出新的RuntimeException(e.getMessage(),e);
}
}
}
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);
}
}
}