开发手册 欢迎您!
软件开发者资料库

NHibernate - 缓存

NHibernate缓存 - 从概述,架构,Orm,环境设置,入门,基本Orm,基本Crud操作,Profiler,添加Intelliesnse到映射文件,数据类型映射,配置,覆盖配置,批量大小,缓存,映射组件开始学习NHibernate ,关系,集合映射,级联,延迟加载,反向关系,加载/获取,Linq,Hibernate查询语言,条件查询,QueryOver查询,本机Sql,流利Hibernate。

在本章中,我们将介绍缓存在NHibernate应用程序中的工作原理.它内置了对缓存的支持.它看起来是一个简单的功能,但实际上,它是最复杂的功能之一.我们将从第一级缓存开始.

第一级缓存

这个缓存机制默认在NHibernate中启用,我们不需要做任何事情来处理缓存.为了理解这一点,让我们看一个简单的例子,你可以看到我们的数据库中有两条记录.

第一级缓存

现在在这个例子中,我们将检索ID为1的学生,我们将使用相同的会话查询两次,如下面的代码所示.

using HibernatingRhinos.Profiler.Appender.NHibernate; using NHibernate.Cache; using NHibernate.Cfg; using NHibernate.Dialect;using NHibernate.Driver; using NHibernate.Linq; using System; using System.Linq; using System.Reflection;namespace NHibernateDemoApp {       class Program {       static void Main(string[] args) {         NHibernateProfiler.Initialize();          var cfg = new Configuration();          String Data Source = asia13797\\sqlexpress;         String Initial Catalog = NHibernateDemoDB;         String Integrated Security = True;         String Connect Timeout = 15;         String Encrypt = False;         String TrustServerCertificate = False;         String ApplicationIntent = ReadWrite;         String MultiSubnetFailover = False;                  cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source +             Initial Catalog + Integrated Security + Connect Timeout + Encrypt +            TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";            x.Driver();             x.Dialect();             x.LogSqlInConsole = true;             x.BatchSize = 10;          });                   //cfg.Configure();                   cfg.Cache(c => {             c.UseMinimalPuts = true;             c.UseQueryCache = true;          });          cfg.SessionFactory().Caching .Through()            .WithDefaultExpiration(1440);          cfg.AddAssembly(Assembly.GetExecutingAssembly());          var sefact = cfg.BuildSessionFactory();                   using (var session = sefact.OpenSession()){             using (var tx = session.BeginTransaction()) {                var studentUsingTheFirstQuery = session.Get(1);               var studentUsingTheSecondQuery = session.Get(1);             }                         Console.ReadLine();          }       }    } }

现在让我们运行这个应用程序并在NHibernate中查看结果Profiler.

运行应用程序

你会惊讶地发现NHibernate只触发一个查询.这就是NHibernate使用第一级缓存的方式.当执行第一个查询时,NHibernate在其第一级缓存中缓存了ID = 1的Student.

因此,当第二个查询执行时,NHibernate首先查找第一级缓存ID为1的学生实体,如果找到该实体,则NHibernate知道,不需要再触发另一个查询来再次检索同一个员工对象.