Проблемы с автозаполнением в ajax для попадания в базу данных или фильтрации предварительно обработанных результатов - PullRequest
1 голос
/ 17 июня 2011

В моем существующем приложении asp.net у меня есть элемент управления автозаполнением ajax, который использует веб-метод для получения результатов автозаполнения, которые интернируют попадание в хранимую процедуру. Но поскольку попадание в базу данных каждый раз является дорогостоящим делом и проблемой производительности, мы хотели кешировать все результаты поиска, которые составляют около 45 000 строк, и использовать данные в касках для фильтрации и получения данных.

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

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

Я знаю, что поддержание 45 тыс. Строк и фильтрация - это настоящая боль. Удар по БД был бы намного лучшим подходом.

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

Замена автозаполнения Ajax на плагин автозаполнения Jquery имеет какое-либо значение ..?

Код: Как и любой другой код автозаполнения ajax:

<ajaxToolkit:AutoCompleteExtender 
    runat="server" 
    ID="autoComplete1" 
    TargetControlID="myTextBox"
    ServiceMethod="GetUserList"></ajaxToolkit:AutoCompleteExtender>
[WebMethod]
public string[] GetUserList(string prefix)
{
return UserManager.GetUserNamesBySearch(prefix);
}

public string[] GetUserNamesBySearch(string prefix)
{
List<User> userCollection=UserServiceMgr.GetUserList(prefix);
var filteredUsers=from user in userCollection
              Where user.FirstName.contain(prefix)
              select user.FirstName.
filterdUsers.ToArray(); 
}

Заранее спасибо

Suri

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

IMO, 45k + записей - это слишком много, чтобы попытаться создать стратегию кеширования.

Учитывая, что «ключ кеша» является частичной строкой, вы получите в кеше дублированные результаты, которые вам нужноиметь дело с.

Мы также используем автозаполнение (jQuery) в нашем приложении ASP.NET MVC, и у нас есть миллионы записей в БД.

Мы используем хранимую процедуру с Полнотекстовый поиск по представлениям индексов в бэкэнде.

И учитывая объем данных, он работает достаточно хорошо.

Поэтому я бы предложил использовать поставщика FTS, такого как SQL Serverили Lucene для оптимизации вашего бэкэнда, а не использования кэша ASP.NET.

FTS является естественным приспособлением для автозавершения, поскольку в нем есть встроенные смарты для таких вещей, как шумовые слова и тезаурусы.

0 голосов
/ 17 июня 2011

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

Когда я говорю «перестроить» кэшированный объект, ваше приложение должно проверить наличие кэшированного объекта, перестроить и восстановить его в кэше, если его нет.

Имейте в виду, что если вы будете использовать SqlDependency, вы должны настроить базу данных для него. aspnet_regsql.exe имеет возможность настроить вашу базу данных. Кроме того, если ваше приложение полагается на то, что ваши данные гарантированно точны, я бы также сделал то, что вы делаете сейчас, или использовал бы SqlDependency.

Пример кэширования

SqlDependency

aspnet_regsql.exe

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