Проблема с кэшем 2-го уровня в NHibernate с помощью QueryOver - PullRequest
2 голосов
/ 14 октября 2011

У меня кэш 2-го уровня работает отлично, когда я использую Session.Get (), однако, если я использую новый API QueryOver в NH3.0, кэш не попадет.

Это прекрасно работает:

public TEntity Get(int id)
{
  return session.Get<TEntity>(id);
}

Это не касается кеша:

public TEntity Get(Expression<Func<TEntity bool>> filter)
{
    var query = _session.QueryOver<TEntity>()
                .Where(filter);

    query.Cacheable();     
    return query.SingleOrDefault();
}

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

Вот моя конфигурация сеанса:

Session = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
                .Mappings(x => x.FluentMappings.AddFromAssemblyOf<Activity>())
                .Cache(c => c.UseSecondLevelCache()
                            .UseQueryCache()
                            .ProviderClass<NHibernate.Cache.HashtableCacheProvider>())
                .ExposeConfiguration(cfg => configuration = cfg)
                .BuildSessionFactory()
                .OpenSession();

Я устанавливаю свои сущности для использования кэша:

public class CommentMap : ClassMap<Comment>
    {
        public CommentMap()
        {
            Cache.ReadWrite();

            Id(x => x.Id);
            Map(x => x.Message);
            References(x => x.Activity);
            References(x => x.User);
        }
    }

Я вызываю метод Cacheable в моих запросах QueryOver:

public TEntity Get(Expression<Func<TEntity, bool>> filter)
        {
            var query = _session.QueryOver<TEntity>()
                .Where(filter);

            query
                .Cacheable();

            return query.SingleOrDefault();
        }

Iдолжно быть, что-то упускает, просто не могу понять, что.

1 Ответ

6 голосов
/ 14 октября 2011

Есть несколько связанных вопросов:

  • Session.Load никогда не попадает в БД, поэтому это не является доказательством того, что кэширование работает
  • Кеш запросов включается отдельно от кеша сущностей
  • Кэширование запросов является явным: вы должны указать NHibernate для кэширования, что QueryOver с использованием метода Cacheable()

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

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