Nhibernate禁用第二级缓存与流利 - 也禁用假缓存

本文关键字:缓存 二级缓存 Nhibernate | 更新日期: 2023-09-27 18:25:01

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());
            }
        }

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

同样在我看到的日志中,

09-04 14:

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

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

Nhibernate禁用第二级缓存与流利 - 也禁用假缓存

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

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

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

我会这样说:不要担心FakeCacheNoCacheProvider。它只是以下各项的实现:

空对象模式

描述

不使用 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内置的处理方式,当查询或二级缓存打开,但没有正确配置提供程序时。正如我们所看到的,对那个的调用只是假的......什么都不做...

总结:不在乎NoCacheProviderFakeCache

注意:另一方面,不仅要为查询缓存正确配置缓存提供程序,而且还应打开第二级缓存。这些实际上是紧密耦合的...

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

扩展:

如果我们不想/不喜欢看到任何内部功能,例如: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最大的功能-它确实非常可扩展和可调。