会话之间的NHibernate二级缓存

时间:2015-04-07 18:00:11

标签: c# .net nhibernate orm fluent-nhibernate

所以根据我的理解,二级缓存应该存储在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而没有任何运气。

0 个答案:

没有答案