установить разбиение на страницы тегов отображения для получения результатов из сеанса

Это теоретический вопрос, поэтому я не публикую здесь код.

Вопрос в том, что я использую отображаемые теги для получения результатов отчета из нескольких таблиц, содержащих не менее 20 миллионов строк. Выполнение запроса требует особого времени, а отображаемые теги отлично справляются с визуализацией таблицы. Результатов может быть тысяча, но я показываю только 10 на странице. Каждый раз, когда я нажимаю на следующую страницу, он переходит к моему классу dao и снова извлекает тот же набор результатов, даже если результаты уже находятся в сеансе для следующей страницы. Теперь в этом сценарии мой вопрос состоит из двух частей.

а) Могу ли я как-то заставить его просматривать сеанс для второй трети или любых последовательных страниц?

б) даже если вторая страница получает результаты со второй страницы, первое выполнение запроса требует времени. Есть ли способ сократить это время?

Я уже ссылался на приведенные ниже вопросы, чтобы иметь представление. Я ищу больше идей.

http://stackoverflow.com/questions/4770807/displaytag-alternatives

мне нравится этот

http://stackoverflow.com/questions/3143408/displaytag-pagination-vs-hibernate-pagination/3144744#3144744

person DJR    schedule 24.12.2013    source источник
comment
Как мы можем улучшить производительность запроса, если мы не можем видеть, что вы уже сделали.   -  person TheCarver    schedule 24.12.2013
comment
чувак ... это хранимая процедура и это большой запрос .. скажем, запрос просто выбирает a, b, c из d, e, f, где i.d = j.e и так далее .. что теперь? моя основная проблема заключается в том, что отображаемые теги дают мне возможность разбивать на страницы... каждый раз, когда я использую опцию разбиения на страницы... запрос запускается снова.   -  person DJR    schedule 24.12.2013


Ответы (2)


В displaytag нет ничего, что говорило бы «вернуться к классу DAO». Все, что он делает, это повторно запрашивает страницу с некоторыми специальными параметрами запроса, которые сообщают ему, какой фрагмент результатов вам показать. Что происходит, когда страница запрашивается, полностью зависит от вас.

Все, что вам нужно сделать, это в вашем обработчике запросов посмотреть, сохраняются ли результаты в сеансе. Если да, то используйте эти результаты в ответе. Если это не так, запустите свой запрос и сохраните их в сеансе, прежде чем возвращать ответ.

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

И тогда возникает вопрос, действительно ли вы хотите (или можете) хранить в памяти более 20 миллионов строк.

person Todd Gibson    schedule 24.12.2013

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

Map stockParamMap = WebUtils.getParametersStartingWith(httpServletRequest, "d-");
if (stockParamMap.size() == 0) { 
     //dao call goes here    
WebUtils.setSessionAttribute(httpServletRequest, "display_tbl",
                    list);     // set list in session
}

Если в вашем URL-адресе нет параметра, содержащего только «d-», он вызовет dao. В противном случае он заполнит список только в сеансе. При разбиении на страницы он будет содержать этот параметр, поэтому он больше не будет вызывать dao. Надеюсь, это поможет вам

person Monicka Akilan    schedule 27.12.2013