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