калитка: как транслировать ресурс из базы данных - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь динамически генерировать карту сайта для большого веб-сайта с тысячами страниц.

Да, я подумал о том, чтобы создать файл карты сайта в автономном режиме и просто обслуживать его статически, и я мог бы сделать именно это. Но я думаю, что это в целом полезный вопрос:

Как я могу передавать большие данные из БД в Wicket?

Я следовал инструкциям на странице Wicket SEO и смог заставить работать динамическую реализацию карты сайта с использованием DataProvider. Но он не масштабируется - ему не хватает памяти, когда он вызывает метод iterator() моего DataProvider с аргументом count, равным общему количеству возвращаемых мной объектов, вместо того, чтобы перебирать их по частям.

Я думаю, что решение лежит где-то с WebResource/ResourceStreamingRequestTarget. Но эти классы ожидают IResourceStream, что в конечном итоге сводится к обеспечению реализации InputStream, которая работает с байтами, а не с записями в БД. Я не знаю, как реализовать метод length() в таком случае, поскольку для этого потребуется заранее просмотреть каждую запись, чтобы вычислить общую длину.

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Из документа метода 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 голосов
/ 14 июня 2011

Я использовал 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);
        }
    }
}
0 голосов
/ 09 июня 2011

Вы можете вернуть -1, указывая неизвестную длину, или вы можете записать результат в буфер памяти или на диск, прежде чем отобразить его клиенту.

Вы также можете использовать этот файл в качестве кэша,так что вам не нужно восстанавливать его каждый раз, когда запрашивается этот ресурс (однако помните, что вы должны обрабатывать параллельные запросы).Также могут быть рассмотрены специальные решения для кэширования (например, memcache, ehcache и т. Д.).

Это может быть чище, чем публикация статического файла, хотя статические файлы, вероятно, лучше, если производительность критична.

...