NHibernate кэширование сущностей между сеансами с использованием SysCache - PullRequest
8 голосов
/ 13 октября 2010

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

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

Это нормальное / желательное поведение?Я просматриваю одну конкретную страницу, которая совершает множество обращений к базе данных, хотя каждый запрос является быстрым, они кажутся ненужными, если объекты могут быть кэшированы.

Редактировать

Хорошо, у меня включен кэш второго уровня, и он работает для запросов.Я просто не могу заставить его работать на сущности.У меня есть Cache.Is(c => c.ReadWrite()) (свободный nhibernate) на моей основной сущности, которую я тестирую.Но нет, он все равно попадает в БД каждый раз.Есть идеи?

Редактировать

Я пытался использовать транзакции так:

public override Accommodation Get(int id) 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
        var accomm = Session.Get<Accommodation>(id); 
        tx.Commit(); 
        return accomm; 
    } 
} 

Мое отображение такое (и вы можете видеть, что мыесть неприятная схема):

public void Override(AutoMapping<Core.Entities.Itinerary.Accommodation.Accommodation> mapping)
{
    mapping.HasManyToMany(x => x.Features).Table("AccommodationLinkFeatureType").ChildKeyColumn("FeatureTypeId").NotFound.Ignore();
    mapping.HasManyToMany(x => x.SimilarAccommodation).Table("AccommodationLinkSimilarAccommodation").ChildKeyColumn("SimilarAccommodationId").NotFound.Ignore();
    mapping.HasMany(x => x.TourItinerary).Table("AccommodationTourItinerary");
    mapping.HasOne(x => x.Images).ForeignKey("AccommodationId").Cascade.All().Not.LazyLoad();
    mapping.References(x => x.CollectionType).NotFound.Ignore().Not.LazyLoad();
    mapping.References(x => x.AccommodationUnitType).NotFound.Ignore().Not.LazyLoad();
    Cache.Is(c => c.ReadWrite());
}

Однако, похоже, это не получается из кеша 2-го уровня.

Кстати, я вижу много примеров в Интернете с использованием Cache.ReadWrite()но я вижу только метод Is на помощнике Cache, поэтому я пытаюсь Cache.Is(c => c.ReadWrite()) - изменился ли интерфейс интерфейса?

Ответы [ 3 ]

4 голосов
/ 13 октября 2010

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

0 голосов
/ 14 апреля 2014

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

http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider

Если ваша среда развертывания находится в Azure, я думаю, этополезно.Обратите внимание, что модуль SysCache не может сосуществовать с модулем AzureMemcached.

http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching

0 голосов
/ 18 мая 2011

У меня была такая же проблема.В моем случае причина была в том, что ссылки отображаются с помощью NotFound (). Ignore () (т. Е. Если сущность с этим внешним ключом не найдена, просто проигнорируйте ее, что в любом случае является ошибкой согласованности данных).Удалите NotFound. Игнорируйте и исправьте вашу базу данных.

...