所以根据我的理解,二级缓存应该存储在Sessions之间,因为它存储在 SessionFactory 级别,但是我无法产生这个结果。
我不确定问题出在哪里,但我的会话工厂配置如下:
var hibernateConfig = Fluently.Configure();
hibernateConfig.Database(MySQLConfiguration
.Standard
.ConnectionString(cs => cs.Server(sqlConfig["host"].ToString())
.Database(sqlConfig["database"].ToString())
.Username(sqlConfig["username"].ToString())
.Password(sqlConfig["password"].ToString())
));
hibernateConfig.Mappings(m => m.FluentMappings.AddFromNamespaceOf<NodeEntity>());
hibernateConfig.Cache(c => c.UseQueryCache().UseSecondLevelCache().ProviderClass<NHibernate.Cache.HashtableCacheProvider>());
SessionFactory = hibernateConfig.BuildSessionFactory();
然后通过Singleton提供会话工厂。
在My App.config中,我已经定义了Cache Region,如下所示:
<configSections>
<section name="syscache" type="NHibernate.Caches.SysCache.SysCacheSectionHandler, NHibernate.Caches.SysCache" requirePermission="false" />
</configSections>
<syscache>
<cache region="Entities" expiration="3600" priority="5" />
<cache region="ShortTerm" expiration="900" priority="3" />
</syscache>
这意味着缓存(我正在使用实体区域)应该在60分钟内保持不变。
应用程序使用Repository模式处理实体,我怀疑这里出了什么问题,但似乎没有。
我的测试是这样完成的:
var factory = EntityManager.GetSessionFactory();
using (var session = factory.OpenSession())
{
DateTime startTime = DateTime.Now;
nodes = session.Query<NodeEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
cables = session.Query<CableEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
Console.WriteLine(DateTime.Now - startTime);
startTime = DateTime.Now;
nodes = session.Query<NodeEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
cables = session.Query<CableEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
Console.WriteLine(DateTime.Now - startTime);
}
using (var session = factory.OpenSession())
{
DateTime startTime = DateTime.Now;
nodes = session.Query<NodeEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
cables = session.Query<CableEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
Console.WriteLine(DateTime.Now - startTime);
startTime = DateTime.Now;
nodes = session.Query<NodeEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
cables = session.Query<CableEntity>().Cacheable().CacheMode(CacheMode.Normal).ToList();
Console.WriteLine(DateTime.Now - startTime);
}
此代码为我提供了以下打印结果:
00:00:12.0721413
00:00:00.0350096
00:00:10.6184812
00:00:00.0350119
从我读到的内容是缓存在相同会话中正常工作,但在打开新会话时却没有效果
我的所有实体在其映射中也有以下代码:
Cache.ReadWrite().Region("Entities");
我在这里缺少什么?是否有可能在会话之间保持缓存? 在这个例子中我使用HashTableProvider。我也试过Syscache而没有任何运气。