Как я кеширую набор данных, чтобы прекратить поездки в БД? - PullRequest
2 голосов
/ 11 сентября 2010

Я создаю страницу результатов поиска в C # на странице ASP.NET 1.1. В моем слое данных у меня есть DataSet, который хранит результат простого старого вызова хранимой процедуры ADO.NET. DataSet имеет две DataTables, и я использую DataVIew для фильтрации и сортировки столбцов. Я хочу заполнить набор данных только один раз, а затем работать с DataTables и производным DataView, пока страница не будет выгружена. Как лучше всего кэшировать DataSet в моем DAL, чтобы он заполнялся только PageLoad? Поместить ли я его в объект Cache, статическую переменную-член, свойство ... У меня нет каких-либо модных сущностей или ORM, это .NET 1.1. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

Будет ли ваш DAL использоваться другими приложениями?Если нет, то вы можете включить кэширование DataSet в Cache или Session в зависимости от того, какие функции необходимы для хранилища.

Session будет специфичным для пользователя и будет очищеноистекает, когда сеанс пользователя истекает, что означает, что данные могут быть намного дольше, чем требуется. Дополнительная информация о сеансе

Cache хороша тем, что срок ее действия истекает автоматически (используйте скользящий срок действия, если данные поиска не будут часто меняться), и вы можете сохранить с ним критерии поиска, чтобыдругие пользователи также могут использовать поиск, что, возможно, сэкономит ваши звонки в БД нескольким пользователям.Возможность доступа нескольких пользователей к этим данным является большим преимуществом перед использованием Session. Дополнительная информация о кеше

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

Вам просто нужен обертка, например:

// Consider this psuedo code for using Cache
public DataSet GetMySearchData(string search)
{
    // if it is in my cache already (notice search criteria is the cache key)
    string cacheKey = "Search " + search;
    if (Cache[cacheKey] != null)
    {
        return (DataSet)(Cache[cacheKey]);
    }
    else
    {
        DataSet result = yourDAL.DoSearch(search);
        Cache[cacheKey].Insert(result);  // There are more params needed here...
        return result;
    }
}
1 голос
/ 11 сентября 2010

есть ORM, которые работают с .net 1.1, но если вы не хотите их использовать, я бы порекомендовал либо заполнить что-то в Cache, чтобы вы могли истечь его, если необходимо, и повторно получить данные. Вы также можете поместить его в объекты сеанса (если данные относятся к конкретному пользователю) или приложения (если это не так).

0 голосов
/ 12 сентября 2010

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

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

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

...