Вам нужно использовать много техник, чтобы успешно это осуществить.
Сначала , вам нужен какой-то постоянный слой. Если вы используете обычный старый сайт, то сессия пользователя будет наиболее логичным для использования. Если вы используете веб-сервисы (т.е. без сеансов) и просто делаете вызовы через клиента, тогда вам все равно нужен своего рода прикладной уровень (своего рода общий сеанс) для ваших сервисов. Зачем? Этот слой будет домом для кэша результатов вашей базы данных.
Второй , вам нужен способ кэширования ваших результатов в любом контейнере, который вы используете (сеанс или прикладной уровень веб-сервисов). Вы можете сделать это несколькими способами ... Если запрос - это то, что может сделать любой пользователь, тогда будет работать простой хеш запроса, и вы можете поделиться этим сохраненным результатом с другими пользователями. Возможно, вам все еще нужен какой-то GUID для результата, чтобы вы могли передавать его в своем клиентском приложении, но полезно будет выполнить поиск по хешу из запросов к результатам. Если эти запросы уникальны, вы можете просто использовать уникальный GUID для результата запроса и передать его клиентскому приложению. Это так, чтобы вы могли выполнять свои функции кэширования ...
Механизм кэширования может включать в себя некоторый буфер фиксированной длины или очередь ... так что старые результаты будут автоматически очищаться / удаляться при добавлении новых. Затем, если поступит запрос, который является пропуском кеша, он будет выполнен нормально и добавлен в кеш.
В-третьих , вы захотите каким-то образом разместить страницу с вашим объектом результата ... Шаблон итератора работает хорошо, хотя, вероятно, может работать что-то более простое ... как fetch X количество результатов, начиная с точки Y . Тем не менее, шаблон Iterator был бы лучше, так как вы могли бы позже удалить свой механизм кэширования и, если пожелаете, страницу непосредственно из базы данных.
Четвертый , вам нужен какой-то механизм предварительной выборки (как предлагали другие). Вы должны запустить поток, который будет выполнять полный поиск, а в вашей основной теме просто выполнить быстрый поиск с количеством элементов X . Надеемся, что к тому времени, когда пользователь попытается выполнить пейджинг, второй поток будет завершен, и ваш полный результат теперь будет в кеше. Если результат не готов, вы можете просто включить некоторую простую логику экрана загрузки.
Это должно помочь вам ... дайте мне знать, если вы хотите получить разъяснения / более подробную информацию о какой-либо конкретной части.
Я оставлю вам еще несколько советов ...
Вы не хотите отправлять весь результат клиентскому приложению (если вы используете Ajax или что-то вроде приложения для iPhone). Зачем? Ну, потому что это огромная трата. Скорее всего, пользователь не будет просматривать все результаты ... теперь вы просто бесплатно отправили более 2 МБ полей результатов.
Javascript - это потрясающий язык, но помните, что он по-прежнему является языком сценариев на стороне клиента ... вы не хотите слишком сильно замедлять работу пользователя, посылая огромные объемы данных для обработки вашим клиентом Ajax , Просто отправьте предварительно выбранный результат вашему клиенту и дополнительные результаты страницы как пользовательские страницы.
Абстракция абстракция абстракция ... вы хотите абстрагировать кеш, запросы, разбиение на страницы, предварительную выборку ... как можно больше. Зачем? Хорошо, скажем, вы хотите переключать базы данных или вы хотите перелистывать страницы непосредственно из базы данных вместо того, чтобы использовать результирующий объект в кеше ... хорошо, если вы все сделаете правильно, это будет легче изменить позже. Кроме того, при использовании веб-сервисов многие другие приложения могут использовать эту логику позже.
Теперь, я, вероятно, предложил сверхпроектированное решение для того, что вам нужно :). Но если вы справитесь с этим, используя все правильные приемы, вы многому научитесь и получите очень хорошую базу на случай, если вы захотите расширить функциональность или повторно использовать этот код.
Дайте мне знать, если у вас есть вопросы.