Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по кэшированию  (Прочитано 12258 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Okkkks
Помогающий

by
Offline Offline

« : 24-01-2011 08:47 » 

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

У меня есть метод который считывает из базы одну таблицу:
Код:

        public static List<Dish> Read_Dish() //выборка всех блюд из базы и сортировка по категории
        {
            List<Dish> dish = new List<Dish>();
         
            using (DataClasses_RestaurantDataContext dc = new DataClasses_RestaurantDataContext())
            {
                dish = dc.Dishes.OrderBy(d => d.Category).ToList();
            }
            return dish;
        }

результат помещаю и список:
Код:
 List<Dish> _dish = Read_Dish();

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

понимаю, что нужно как-то прикрутить сюда CacheDependency, но никак не могу с ним договориться... =((
если указать путь к файлу базы, тогда как указать нужную таблицу?..

Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-01-2011 09:50 » 

Какой кэш, чей кэш? Кэш страницы? Кэш базы данных? Твой собственный самописный кэш?

Зачем этот кэш нужен? Какие задачи решаются с его помощью?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #2 : 24-01-2011 10:27 » 

я так понимаю кэш, который System.Web.Caching.Cache.
мне нужно кэшировать объект(список  _dish ), не страницу. С его помощью предполагается разгрузить базу(из данной таблицы часто извлекаются даннные).

изначально при добавлении скажем записи в таблицу,  так же добавлялась эта запись и в список, чтобы лишний раз не читать из базы, на что мне сказали "нафиг такие сложности, если есть стандартный вариант решения через кэширование объекта. там есть возможность отследить изменения в таблице и автоматически обновить кэш".
 вот и думаю теперь как это сделать-то....=(
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 24-01-2011 14:01 » 

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

Во-первых, это должно быть разрешено в веб-приложении. Полагаю, что это есть.

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

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

Поэтому непонятно, как данная задача накладывается на данные обстоятельства.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #4 : 24-01-2011 14:05 » 

ну сколько у ресторана может быть блюд?... ну даже если 100-150 что мало вероятно(как мне кажется)... это же не много...   а список этот - он общий для всех пользователей.

да я в принципе склонна с вами согласиться =)) но только подскажите тогда как будет правильно это реализовать?
сейчас у меня получается дублирование действий(вставка в базу-вставка в список, удаление из базы - удаление из списка...)   Краснею

« Последнее редактирование: 24-01-2011 14:12 от Okkkks » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-01-2011 14:33 » 

Okkkks, насколько часто изменяется этот список? Мне почему-то кажется, что читают его гораздо чаще, чем меняют.

Разумеется, кэшировать нужно исходные данные (как они пришли от сервера), а не результаты сортировки, потому что сортировка - это форма представления - для разных пользователей разная.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #6 : 24-01-2011 14:36 » 

да, читают его гораздо чаще.  у меня получается выборка из данных,хранящихся  в этом списке ну почти на каждой странице...
этот список как раз и хранит данные, которые вернул сервер, а  сортировка там для порядка, чтоб потом отдельно не сортировать =))
« Последнее редактирование: 24-01-2011 14:49 от Okkkks » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 24-01-2011 20:01 » 

Okkkks, разумно:
1) написать синглетон, обеспечивающий работу с этими данными;
2) внутри него реализовать доступ к кэшу по схеме много читателей-один писатель;
3) при записи одновременно вносить изменения в кэшированный список и базу данных;
4) если в кэше ничего нет - запросить данные из базы данных и построить список.

Пункты 3-4 справедливы только при условии, что данные в базе данных меняются только посредством этого веб-приложения (т.е. нет других приложений, добавляющих/изменяющих/удаляющих эти данные). Если другие приложения есть, для пункта 4 нужно изменить правило.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #8 : 25-01-2011 19:43 » 

Dimka, а можно по 2-му пункту чуточку подробнее?...Краснею
как реализуется схема много читателей-один писатель?
а как быть если у меня может быть не один писатель? например 2 администратора одновременно с разных компов захотят добавлять?...
или синглетон нужен для того, чтобы обеспечить работы с данными, в один и тот же момент времени, только одного пользователя? я правильно понимаю?
« Последнее редактирование: 25-01-2011 20:25 от Okkkks » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 25-01-2011 20:54 » 

Okkkks,

1) Синглетон обеспечивает не работу только одного пользователя в один момент времени с данными, а то, что эти данные являются общими для всех (имеются в единственном экземпляре).

2) Как раз единственность изменения данных в один момент времени обеспечивает схема организации параллельной работы пользователей "много читателей - один писатель". Я не могу "чуточку подробнее" про это говорить - фактически это шаблон проектирования взаимодействия параллельных процессов. Либо его излагать целиком (чего я делать не собираюсь - google ещё не отменяли и к ASP.NET это отношения не имеет), либо и говорить про это особо нечего: много читателей ходят и читают (в том числе одновременно) какие-то данные, затем приходит писатель, выгоняет (или дожидается, пока сами уйдут) всех читателей и меняет данные, затем допускает их обратно - читать новые данные.

Соответственно, 2 администратора тут ни причём. Хоть десять. Для приложения это всё одно и то же - пользователи с теми или иными правами.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #10 : 26-01-2011 06:30 » new

Dimka,  спасибо большое за помощь =) в целом стало понятнее осталось детально разобрать =)))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines