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(]
似乎默认情况下启用二级缓存,即使我们没有配置它。 禁用它的更清洁的方法是什么。
config.Cache(x => x.Not.UseSecondLevelCache());
解决了我的问题。它删除了所有日志和不必要的 CPU 周期。这是通过流利的。如果您使用的是配置,则可能需要以下配置。
<property name="cache.use_second_level_cache">
false
</property>
我会这样说:不要担心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内置的处理方式,当查询或二级缓存打开,但没有正确配置提供程序时。正如我们所看到的,对那个的调用只是假的......什么都不做...
总结:不在乎NoCacheProvider
或FakeCache
。
注意:另一方面,不仅要为查询缓存正确配置缓存提供程序,而且还应打开第二级缓存。这些实际上是紧密耦合的...
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最大的功能-它确实非常可扩展和可调。