Как настроить кэш второго уровня NHibernate в NHibernate >= 3.2?
Перед обновлением до NHibernate 3.2 я использовал следующий код для Fluent NHibernate:
OracleClientConfiguration configurer = (OracleClientConfiguration.Oracle10.ShowSql().ConnectionString(c =>
c.FromConnectionStringWithKey(ConnectionString.Development))
.DefaultSchema("MySchema")
.UseReflectionOptimizer()
/* Here --> */ .Cache(c =>
c.ProviderClass<SysCacheProvider>()
.UseQueryCache()));
Тем не менее .Cache()
метод расширения больше не найден в NHibernate 3.2.
Как мне настроить мой поставщик кеша?
Изменить: я также пытался:
.ExposeConfiguration(configuration =>
{
configuration.SetProperty(Environment.UseQueryCache, "true");
configuration.SetProperty(Environment.CacheProvider, "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache2");
});
2 ответа
Это выдержка из моей конфигурации с использованием провайдера SysCache.
var configuration = new Configuration()
.Cache(x => x.UseQueryCache = true)
configuration.SessionFactory()
.Caching.Through<SysCacheProvider>().WithDefaultExpiration(60)
См. http://www.markhneedham.com/blog/2010/06/16/fluent-nhibernate-and-the-2nd-level-cache/& https://web.archive.org/web/20110514214657/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx
Распространенная ошибка (это также случилось со мной!) - забыть зафиксировать или пропустить транзакцию при добавлении или изменении сущности / агрегата в базе данных. Если мы теперь получим доступ к объекту / агрегату из другого сеанса, то кэш 2-го уровня не будет готов предоставить нам кэшированные экземпляры, и NHibernate сделает (неожиданный возврат в базу данных).
У меня та же проблема, и гуглил много раз, наконец я это увидел. Плохая новость в том, что я пытался использовать trasaction и все еще не смог открыть кэш 2-го уровня!