Stream wicket:如何从数据库流式传输资源

Stream wicket:如何从数据库流式传输资源,stream,streaming,wicket,Stream,Streaming,Wicket,我正在尝试为一个包含数千页的大型网站动态生成站点地图 是的,我已经考虑过离线生成站点地图文件,并简单地静态地为其提供服务,我可能最终会这样做。但我认为这是一个普遍有用的问题: 如何从Wicket中的数据库中传输大数据? 我按照当时的说明进行操作,并能够使用数据提供程序实现动态站点地图。但是它不能扩展—当它调用我的DataProvider的迭代器()方法时,它的内存不足,而countarg等于我返回的对象总数,而不是分块对它们进行迭代 我认为解决方案存在于WebResource/ResourceS

我正在尝试为一个包含数千页的大型网站动态生成站点地图

是的,我已经考虑过离线生成站点地图文件,并简单地静态地为其提供服务,我可能最终会这样做。但我认为这是一个普遍有用的问题:

如何从Wicket中的数据库中传输大数据?

我按照当时的说明进行操作,并能够使用数据提供程序实现动态站点地图。但是它不能扩展—当它调用我的DataProvider的
迭代器()
方法时,它的内存不足,而
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);
        }
    }
}