Вопрос

Мы только начали использовать LINQ to SQL на работе для нашего DAL, и на самом деле мы еще не разработали стандартную модель кэширования.Ранее мы использовали базовый класс 'DAL', который реализовывал свойство менеджера кэша, унаследованное от всех наших классов DAL, но теперь у нас его нет.Мне интересно, придумал ли кто-нибудь "стандартный" подход к кэшированию LINQ к результатам SQL?

Мы работаем в веб-среде (IIS), если это имеет значение.Я знаю, что это вполне может закончиться тем, что субъективный вопрос, но я все еще думаю, что эта информация была бы ценной.

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

Это было полезно?

Решение

Быстрый ответ: используйте шаблон репозитория (см. «Проектирование на основе доменов» Эванса), чтобы получить ваши объекты. Каждый репозиторий будет кэшировать вещи, которые он будет хранить, в идеале, позволяя каждому экземпляру репозитория обращаться к одноэлементному кешу (каждый поток / запрос будет создавать новый репозиторий, но может быть только один кеш).

Ответ выше работает только на одном компьютере. Чтобы использовать это на многих компьютерах, используйте memcached в качестве решения для кэширования. Удачи!

Другие советы

Мой Кэш результатов запроса LINQ вероятно, это как раз то, что вы ищете.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();

Пит.

Это прямо у тебя под носом.

List<TableItem> myResult = (from t in db.Table select t).ToList();

Теперь просто кэшируйте myResult, как если бы вы кэшировали возвращенные данные старого DAL.

Я нашел этот пост , в котором предлагает метод расширения как средство кэширования объектов LINQ.

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

Шаблон репозитория имеет тенденцию ограничивать полезность Linq, поскольку (без переопределения IQueryable) кэширование должно выполняться вне оператора Linq.

Более того, отложенная загрузка и отслеживание объектов - это большие запреты, если вы собираетесь кэшировать ваши объекты, что делает выполнение обновлений несколько сложнее.

Любой, кому удалось решить эту проблему в дикой природе в рамках очень параллельного веб-проекта, присоединяйтесь и спасите мир! :)

Я понимаю, что это, возможно, немного поздний ответ ... Тем не менее, вы можете попробовать проект LinqToCache . Он перехватывает SqlDepdency для произвольного запроса LINQ, если это возможно, и обеспечивает активное аннулирование кэша с помощью уведомлений о запросах на стороне сервера. Запросы должны быть действительными для уведомлений, см. Создание запроса для уведомлений . Большинство запросов Linq-to-sql соответствуют этим ограничениям, если таблицы указываются с использованием имен из двух частей ( dbo.Table , а не только Table ).

См. метод «GetReferenceData» в классе «ReferenceData» в эта статья : http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

Он использует кеш страниц asp.net для кэширования данных, полученных с помощью L2S.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top