首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate用Fluent禁用二级缓存也禁用假缓存

Nhibernate用Fluent禁用二级缓存也禁用假缓存
EN

Stack Overflow用户
提问于 2014-09-29 14:40:54
回答 2查看 3.8K关注 0票数 2
代码语言:javascript
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-29 19:37:08

代码语言:javascript
复制
config.Cache(x => x.Not.UseSecondLevelCache());

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

代码语言:javascript
复制
<property name="cache.use_second_level_cache">
  false
</property>
票数 3
EN

Stack Overflow用户

发布于 2014-09-29 16:13:36

我可以这样说:不要担心FakeCacheNoCacheProvider。它只是以下几个方面的实施:

空对象模式

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

这是几行FakeCache

代码语言:javascript
复制
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

注意:另一方面,正确配置缓存提供程序不仅适用于查询缓存,而且还应该打开第二级缓存。它们实际上是紧密相连的..。

代码语言:javascript
复制
config.Cache(c => c
    .ProviderClass....
      .UseQueryCache()
      .UseSecondLevelCache() // Second Leve Cache keeps items by ID

展期:

如果我们不想/不想看到任何内部特性,例如:NoCacheProvider.cs

代码语言:javascript
复制
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最大的功能--它实际上是非常可扩展和可调整的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26102509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档