2013-12-24 2 views
1

Это теоретический вопрос, поэтому я не размещаю здесь никакого кода.set Отображение тегов pagination для получения результатов с сеанса

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

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

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

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

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

Мне нравится этот один

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

Как мы можем улучшить производительность запроса, когда мы не можем видеть, что вы уже сделали. – TheCarver

+0

dude .. его хранимая процедура и большой запрос осыпки .. позволяет сказать, что запрос просто выбирает a, b, c из d, e, f где i.d = j.e и т. Д. Теперь что? моя основная проблема заключается в том, что теги дисплея дают мне возможность разбивать на страницы ... каждый раз, когда я использую параметр разбиения на страницы .. запрос запускается снова. – DJR

ответ

0

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

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

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

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

0

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

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

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