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)]
即使我们没有配置它,似乎默认启用了二级缓存。什么是更清洁的方法来禁用它。
答案 0 :(得分:3)
config.Cache(x => x.Not.UseSecondLevelCache());
解决了我的问题。它删除了所有日志和不必要的cpu周期。这是通过流利的。如果您正在使用配置,则可能需要进行配置。
<property name="cache.use_second_level_cache">
false
</property>
答案 1 :(得分:1)
我会这样说:不要担心FakeCache
和NoCacheProvider
。它只是一个实现:
<强>描述强>
不使用 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。正如我们所看到的那样,对它的调用只是假电话......无所事事......
摘要:不关心NoCacheProvider
或FakeCache
。
注意:另一方面,正确配置缓存提供程序不仅适用于查询缓存,还应该打开二级缓存。事实上这些是紧密耦合的......
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的最大力量 - 它实际上是非常可扩展和可调整的。