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)
即使我们没有配置第二级缓存,默认情况下也会启用它。什么是更清洁的方法来禁用它。
发布于 2014-09-29 19:37:08
config.Cache(x => x.Not.UseSecondLevelCache());解决了我的问题。它删除了所有日志和不必要的cpu周期。这是通过流利的。如果您正在使用配置,则可能需要以下配置。
<property name="cache.use_second_level_cache">
false
</property>发布于 2014-09-29 16:13:36
我可以这样说:不要担心FakeCache和NoCacheProvider。它只是以下几个方面的实施:
空对象模式
描述 不使用空引用来表示对象的缺失(例如,不存在的客户),而是使用对象(实现了预期的接口),而使用方法主体为空的。这种方法相对于可工作的默认实现的优点是,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最大的功能--它实际上是非常可扩展和可调整的。
https://stackoverflow.com/questions/26102509
复制相似问题