Nhibernate使用Fluent禁用二级缓存 - 也禁用假缓存

时间:2014-09-29 14:40:55

标签: c# caching nhibernate fluent-nhibernate

var config =
            Fluently
                .Configure()
                .Database(MsSqlConfiguration.MsSql2008
                                            .IsolationLevel(IsolationLevel.ReadCommitted)
                                            .ConnectionString(connectionString)
                                            .DefaultSchema(defaultSchema)
                                            .FormatSql())
                                            .ExposeConfiguration
                                            (
                                                c => c.SetProperty("current_session_context_class", sessionContext)
                                            );

        if (secondLevelCacheSettings.UseSecondLevelCache)
        {
            if (secondLevelCacheSettings.CacheType == SecondLevelCacheSettings.SecondLevelCacheType.Memcached)
            {
                config.Cache(c => c.ProviderClass<MemCacheProvider>().UseQueryCache())
                    .ExposeConfiguration(c => c.SetProperty("expiration",
                                                            secondLevelCacheSettings.CacheExpirationMinutes.ToString()));
            }
            if (secondLevelCacheSettings.CacheType == SecondLevelCacheSettings.SecondLevelCacheType.HashTable)
            {
                config.Cache(c => c.ProviderClass<HashtableCacheProvider>().UseQueryCache());
            }
        }

当我不想使用二级缓存时,我想完全禁用它。似乎默认配置是使用FakeCache。如何禁用FakeCache?

同样在我看到的日志中,

  

09-04 14:14:02,088警告在类中启用了二级缓存,但未选择任何缓存提供程序。使用假缓存。 - [4] NHibernate.Cache.NoCacheProvider [(null)]

即使我们没有配置它,似乎默认启用了二级缓存。什么是更清洁的方法来禁用它。

2 个答案:

答案 0 :(得分:3)

config.Cache(x => x.Not.UseSecondLevelCache());

解决了我的问题。它删除了所有日志和不必要的cpu​​周期。这是通过流利的。如果您正在使用配置,则可能需要进行配置。

<property name="cache.use_second_level_cache">
  false
</property>

答案 1 :(得分:1)

我会这样说:不要担心FakeCacheNoCacheProvider。它只是一个实现:

Null Object pattern

  

<强>描述

     

不使用 null 引用来传达对象(例如,不存在的客户)的缺失,而是使用对象 实现预期的接口,但的方法体为空。这种方法优于工作默认实现的优点是Null对象是非常可预测的并且没有副作用:它什么都不做。

这几行FakeCache

public class FakeCache : ICache
{
    public FakeCache(string regionName)
    {
        RegionName = regionName;
    }

    public object Get(object key)
    {
        return null;
    }

    public void Put(object key, object value)
    {
    }

    public void Remove(object key)
    {
    }
    ...

所以,这只是NHibernate内置的方式,当查询或二级缓存打开时,如何处理情况,但没有正确配置Provider。正如我们所看到的那样,对它的调用只是假电话......无所事事......

摘要:不关心NoCacheProviderFakeCache

注意:另一方面,正确配置缓存提供程序不仅适用于查询缓存,还应该打开二级缓存。事实上这些是紧密耦合的......

config.Cache(c => c
    .ProviderClass....
      .UseQueryCache()
      .UseSecondLevelCache() // Second Leve Cache keeps items by ID

EXTEND:

如果我们不想/希望看到任何内部功能,例如:NoCacheProvider.cs

namespace NHibernate.Cache
{
    /// <summary>
    /// A cache provider placeholder used when caching is disabled.
    /// </summary>
    public class NoCacheProvider : ICacheProvider
    {
        private static readonly IInternalLogger log = LoggerProvider
            .LoggerFor(typeof(NoCacheProvider));

        public const string WarnMessage = "Second-level cache is enabled in a class,"+
                              " but no cache provider was selected. Fake cache used.";
        ....

注入ICacheProvider我们自己的/自定义实现 - 没有任何记录等。这是NHibernate的最大力量 - 它实际上是非常可扩展和可调整的。