Entity Framework и NHibernate - Кэширование по-прежнему является обязанностью уровня обслуживания? - PullRequest
4 голосов
/ 09 февраля 2011

До использования ORM мы всегда выполняли кэширование объектов на нашем сервисном уровне. Это дало нам возможность переключаться между различными уровнями данных без необходимости менять нашу реализацию кэширования.

В настоящее время мы используем как Entity Framework (в основном, сначала код), так и NHibernate. Похоже, что NHibernate обладает гораздо лучшими функциями кэширования благодаря нескольким поставщикам кэша 2-го уровня.

Другая проблема, с которой я сталкиваюсь, заключается в том, что для обоих вышеперечисленных ORM мы используем лениво загруженные свойства. Поэтому, если мы извлекаем объект из кеша, нам обычно нужно повторно присоединить его к текущему ObjectContext / ISession, что мы не можем сделать на нашем уровне обслуживания.

Так что мне действительно стоит задуматься о реализации кэширования на уровне хранилища / данных; и вероятно ли, что я найду общее решение, которое будет работать для EF и NH?

Спасибо Ben

Ответы [ 2 ]

4 голосов
/ 09 февраля 2011

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

CQRS превращает эти механические соображения в политические решения. И это ORM-агностик.

2 голосов
/ 09 февраля 2011

По моему опыту, кэш 2-го уровня, предоставленный ORM, будет кешировать данные на основе фактического набора результатов, извлеченного из базы данных.Это может привести к большим накладным расходам, поскольку создание экземпляров объекта и заполнение данных довольно дорого.

Преимущество заключается в том, что ленивая загрузка и т. Д. Будет работать нормально, но большие результаты по-прежнему будут использовать много ресурсов при повторном заполненииobjects.

Мы используем комбинацию кэша 2-го уровня и кэша ASP.NET в нашем веб-приложении из-за дорогостоящих накладных расходов, которые в редких случаях экономят нам целых несколько секунд (!), но с недостаткомне в состоянии лениво загружать коллекции или обновлять сущности.

Это основано только на NHibernate, я никогда не работал с фреймворком сущностей, но я предполагаю, что все фреймворки ORM страдают от этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...