ASP.net Cacheing - правильное использование - PullRequest
0 голосов
/ 03 февраля 2010

Я создаю веб-приложение, и у меня возникла проблема с кэшированием.

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

Я пытался использовать кэширование следующим образом:

        public static List<DAL.EntityClasses.AccountsEntity> Accounts
    {
        get
        {
            if (HttpContext.Current.Cache["Account"] == null)
            {
                HttpContext.Current.Cache.Insert("Account", LoadAccounts(), null, DateTime.Now.AddHours(4), System.Web.Caching.Cache.NoSlidingExpiration);
            }

            return (List<DAL.EntityClasses.AccountsEntity>)HttpContext.Current.Cache["Account"];
        }
    }

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

Таким образом, большинство вызовов вызывают БД для получения данных для кэша.

Где я ошибся?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 февраля 2010

Это нормально для LRU кеша - наименее используемые элементы выталкиваются по мере заполнения кеша.

Настройте кэш для больших объемов данных.

1 голос
/ 03 февраля 2010

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

Что может произойти, что между этой строкой

if (HttpContext.Current.Cache["Account"] == null)

и эта строка:

 return (List<DAL.EntityClasses.AccountsEntity>)HttpContext.Current.Cache["Account"]; 

ваш кеш может быть очищен / запись об учетной записи может быть удалена из кеша.

лучшей реализацией будет:

public static List<DAL.EntityClasses.AccountsEntity> Accounts             
{             
    get             
    {  
      List<DAL.EntityClasses.AccountsEntity> accounts = 
       HttpContext.Current.Cache["Account"] as List<DAL.EntityClasses.AccountsEntity> 

      if(accounts == null)
      {
        accounts = LoadAccounts();
        HttpContext.Current.Cache.Insert("Account", accounts, null, DateTime.Now.AddHours(4), System.Web.Caching.Cache.NoSlidingExpiration);          
      }  
      return accounts;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...