Okkkks
Помогающий
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 24-01-2011 09:50 » |
|
Какой кэш, чей кэш? Кэш страницы? Кэш базы данных? Твой собственный самописный кэш?
Зачем этот кэш нужен? Какие задачи решаются с его помощью?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Okkkks
Помогающий
Offline
|
|
« Ответ #2 : 24-01-2011 10:27 » |
|
я так понимаю кэш, который System.Web.Caching.Cache. мне нужно кэшировать объект(список _dish ), не страницу. С его помощью предполагается разгрузить базу(из данной таблицы часто извлекаются даннные).
изначально при добавлении скажем записи в таблицу, так же добавлялась эта запись и в список, чтобы лишний раз не читать из базы, на что мне сказали "нафиг такие сложности, если есть стандартный вариант решения через кэширование объекта. там есть возможность отследить изменения в таблице и автоматически обновить кэш". вот и думаю теперь как это сделать-то....=(
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 24-01-2011 14:01 » |
|
Okkkks, т.е. речь идёт о том, чтобы использовать кэш веб-приложения для хранения своих объектов.
Во-первых, это должно быть разрешено в веб-приложении. Полагаю, что это есть.
Во-вторых, кэш приложения существует в единственном экземпляре, а пользователей, одновременно работающих с одной страницей и этим набором данных, может быть много. Поэтому набор данных должен быть независим от контекста пользователя.
В-третьих, очистка кэша приложения происходит автоматически, и поэтому если список объёмный по размеру (десятки Мб), он скорее подвергнется удалению - выгоднее хранить в кэше данные маленькими независимыми частями, чем большим куском.
Поэтому непонятно, как данная задача накладывается на данные обстоятельства.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Okkkks
Помогающий
Offline
|
|
« Ответ #4 : 24-01-2011 14:05 » |
|
ну сколько у ресторана может быть блюд?... ну даже если 100-150 что мало вероятно(как мне кажется)... это же не много... а список этот - он общий для всех пользователей. да я в принципе склонна с вами согласиться =)) но только подскажите тогда как будет правильно это реализовать? сейчас у меня получается дублирование действий(вставка в базу-вставка в список, удаление из базы - удаление из списка...)
|
|
« Последнее редактирование: 24-01-2011 14:12 от Okkkks »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #5 : 24-01-2011 14:33 » |
|
Okkkks, насколько часто изменяется этот список? Мне почему-то кажется, что читают его гораздо чаще, чем меняют.
Разумеется, кэшировать нужно исходные данные (как они пришли от сервера), а не результаты сортировки, потому что сортировка - это форма представления - для разных пользователей разная.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Okkkks
Помогающий
Offline
|
|
« Ответ #6 : 24-01-2011 14:36 » |
|
да, читают его гораздо чаще. у меня получается выборка из данных,хранящихся в этом списке ну почти на каждой странице... этот список как раз и хранит данные, которые вернул сервер, а сортировка там для порядка, чтоб потом отдельно не сортировать =))
|
|
« Последнее редактирование: 24-01-2011 14:49 от Okkkks »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #7 : 24-01-2011 20:01 » |
|
Okkkks, разумно: 1) написать синглетон, обеспечивающий работу с этими данными; 2) внутри него реализовать доступ к кэшу по схеме много читателей-один писатель; 3) при записи одновременно вносить изменения в кэшированный список и базу данных; 4) если в кэше ничего нет - запросить данные из базы данных и построить список.
Пункты 3-4 справедливы только при условии, что данные в базе данных меняются только посредством этого веб-приложения (т.е. нет других приложений, добавляющих/изменяющих/удаляющих эти данные). Если другие приложения есть, для пункта 4 нужно изменить правило.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Okkkks
Помогающий
Offline
|
|
« Ответ #8 : 25-01-2011 19:43 » |
|
Dimka, а можно по 2-му пункту чуточку подробнее?... как реализуется схема много читателей-один писатель? а как быть если у меня может быть не один писатель? например 2 администратора одновременно с разных компов захотят добавлять?... или синглетон нужен для того, чтобы обеспечить работы с данными, в один и тот же момент времени, только одного пользователя? я правильно понимаю?
|
|
« Последнее редактирование: 25-01-2011 20:25 от Okkkks »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 25-01-2011 20:54 » |
|
Okkkks,
1) Синглетон обеспечивает не работу только одного пользователя в один момент времени с данными, а то, что эти данные являются общими для всех (имеются в единственном экземпляре).
2) Как раз единственность изменения данных в один момент времени обеспечивает схема организации параллельной работы пользователей "много читателей - один писатель". Я не могу "чуточку подробнее" про это говорить - фактически это шаблон проектирования взаимодействия параллельных процессов. Либо его излагать целиком (чего я делать не собираюсь - google ещё не отменяли и к ASP.NET это отношения не имеет), либо и говорить про это особо нечего: много читателей ходят и читают (в том числе одновременно) какие-то данные, затем приходит писатель, выгоняет (или дожидается, пока сами уйдут) всех читателей и меняет данные, затем допускает их обратно - читать новые данные.
Соответственно, 2 администратора тут ни причём. Хоть десять. Для приложения это всё одно и то же - пользователи с теми или иными правами.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Okkkks
Помогающий
Offline
|
|
« Ответ #10 : 26-01-2011 06:30 » |
|
Dimka, спасибо большое за помощь =) в целом стало понятнее осталось детально разобрать =)))
|
|
|
Записан
|
|
|
|
|