Большую часть наших данных необходимо обновлять всего несколько раз в день, другие данные очень нестабильны.
- Данные, которые почти не изменяются, мы кэшируем в памяти при запуске, отделяем их от контекста и затем используем их в основном для чтения, резко уменьшая количество запросов к базе данных, которые нам приходится делать.
- Изменчивые данные запрашиваются каждый раз DbContext для каждого Http-запроса.
- Когда мы обновляем кэшированные данные, мы отправляем сообщение всем экземплярам, чтобы поймать свежие данные версию всех данных с SQL-сервера.
Пока мы не добавили ошибку, которая связывала один из этих «кэшированных» объектов с «изменчивыми» данными, и не выполнили операцию «Сохранить изменения».
Ну, это был настоящий беспорядок.
Все дерево данных добавлялось снова и снова при каждом обновлении, повреждая всю базу данных множеством дублированных данных. data.
В качестве полного хака я добавил совершенно произвольный столбец с UniqueConstraint и какими-то бессмысленными данными в одну из корневых таблиц; надеюсь, что в следующий раз, когда мы представим такую ошибку, мы не сможем выполнить SaveChanges(), потому что она нарушит ограничение уникальности.
Но это, конечно, хакерство, и я все еще очень напуган ;P
Есть ли лучшие способы предотвратить попадание в базу данных целого дерева кэшированных объектов?
Подробнее
- Проект — ASP.NET MVC
- Я кэширую эти данные, поскольку они в основном доступны только для чтения, и это экономит массу дополнительных вызовов базы данных на каждый HTTP-запрос.
- Это веб-сайт с высоким трафиком и множеством индивидуальных настраиваемых представлений. Наличие данных POCO в памяти очень хорошо подходит для того, что я хочу. За исключением проблемы, о которой я упомянул.
- Это немного сложнее, но упрощенная версия заключается в том, что я кэширую объекты по одному: то есть:
Код: Выделить всё
EntityCache.Instance.LolCats = new DbContext().LolCats.AsNoTracking().ToList();Подробнее здесь: https://stackoverflow.com/questions/253 ... -framework
Мобильная версия