摘要

NHibernate的二级缓存由SessionFactory管理,由所有Session共享。

NHibernate缓存读取顺序:

首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并返回

  • 如果一级缓存对象不存在,则读二级缓存。
  • 如果二级缓存对象存在,则读取二级缓存里的对象并返回
  • 如果二级缓存对象不存在,则读数据库

二级缓存一般存储不发生变化的数据,如果数据经常要进行修改删除操作,不宜使用缓存

1. NHibernate二级缓存设置

NHibernate的二级缓存在hibernate.cfg.xml文件中设置。

  • cache.provider_class:二级缓存提供程序。NHibernate自带二级缓存提供程序类NHibernate.Cache.HashtableCacheProvider(许多书上说实际项目中建议不要使用这个类,这里只做为示例使用它)。如果需要使用第三方NHibernate二级缓存提供类,则需要在程序里添加第三方dll引用,并在cache.provider_class指向第三方类。这些第三方缓存provider都是开源的,可以从NHibernate Contrib下载。
  • cache.use_second_level_cache:设置是否使用二级缓存
  • class-cache:为NHibernate实体类设置缓存策略,格式是:
    <class-cache class="完整类名,Assembly名称" usage="read-only|read-write|nonstrict-read-write|transactional"/>

  class是NHibernate实体类,以逗号隔开,前部分是完整的类名,后面部分是assembly名称。

  usage是并发访问策略,NHibernate内置四种并发访问策略,可以设置下面四个值:

    • read-only:只读缓存,适用于只读数据。
    • read-write:读写缓存。
    • nonstrict-read-write:非严格读写缓存,不保证缓存与数据库的一致性。
    • transactional:事务缓存,提供可重复读的事务隔离级别。

  一般只需要设置成read-only或者read-write,这篇文章第二部分介绍更新操作对二级缓存的影响。

  • 除了在hibernate.cfg.xml文件中设置class-cache指定为哪一个实体类设置二级缓存以外,也可以在实体关系映射配置文件内设置。

   设置方法是在id属性之前添加这句:<cache usage="read-only|read-write|nonstrict-read-write|transactional" />

  • 推荐统一在hibernate.cfg.xml文件中设置,后期维护更方便。

程序演示

修改hibernate.cfg.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.connection_string_name">default</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>
<property name="cache.use_second_level_cache">true</property>
<mapping assembly="NHibernateDemoApp"/>
<class-cache class="NHibernateDemoApp.Customer,NHibernateDemoApp" usage="read-write"/>
</session-factory>
</hibernate-configuration>

修改Main函数

         static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); //在两个session里两次查询相同对象
using (var session = SessionFactory.OpenSession())
{
var customer = session.Get<Customer>();
} using (var session = SessionFactory.OpenSession())
{
var customer = session.Get<Customer>();
} Console.WriteLine("Completed");
Console.ReadLine();
}

打开NHibernateProfile,ctrl+x清空所有Session,F5执行应用程序得到结果

结果显示只查询了一次数据库。因为是两独立session两次查询同一个持久化对象,如果没有使用二级缓存,应该是两次查询数据库,结果跟上一篇文章一样。但是这里使用了二级缓存,二级缓存在所有ISession里共享,因此只查询一次数据库。

NHibernateProfile的结果第二行内容,也明确表明了,第二次Get的时候是从二级缓存中读取的。

2. 更新操作对二级缓存的影响

更新操作对二级缓存的影响由配置项class-cache的属性usage决定,如果设置的是read-only,则数据更新后不刷新缓存。如果设置的是read-write,则数据更新后刷新二级缓存,第二次Session查询将重新查询数据库。

程序演示

修改Main函数

         static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); using (var session = SessionFactory.OpenSession())
{
Console.WriteLine("in session 1");
var customer = session.Get<Customer>();
Console.WriteLine("before updated: {0} {1}", customer.FirstName, customer.LastName);
customer.LastName = "Chen";
session.SaveOrUpdate(customer);
session.Flush();
Console.WriteLine("after updated: {0} {1}", customer.FirstName, customer.LastName);
} using (var session = SessionFactory.OpenSession())
{
Console.WriteLine("in session 2");
var customer = session.Get<Customer>();
Console.WriteLine("{0} {1}", customer.FirstName, customer.LastName);
} Console.WriteLine("Completed");
Console.ReadLine();
}

ctrl+x清空NHibernateProfile的Session,F5执行程序,得到结果

LastName已经得到更新,第二次session查询得到了最新的记录。

第二次session查询自动查询数据库。

NHibernate系列文章九:NHibernate对象二级缓存上的更多相关文章

  1. NHibernate系列文章目录

    第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...

  2. NHibernate系列文章十:NHibernate对象二级缓存下

    摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...

  3. NHibernate系列文章八:NHibernate对象一级缓存

    摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...

  4. NHibernate系列文章七:NHibernate对象状态

    摘要 NHibernate对象持久化 NHibernate对象的三个状态:临时态.持久态.游离态(托管态) NHibernate三状态的相互转化 1. NHibernate对象持久化 NHiberna ...

  5. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...

  6. NHibernate系列文章十七:NHibernate Session管理(附程序下载)

    摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...

  7. NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)

    摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...

  8. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

  9. NHibernate系列文章十一:NHibernate并发控制

    摘要 在同一时刻数据访问量和更新次数比较大的系统中,产生了数据的并发访问问题.并发访问使得在这样的环境中,所有用户(程序.实际用户.进程.线程等)的操作不产生负面问题. 如果不使用并发,在两个用户同时 ...

随机推荐

  1. 北大poj-1062

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43523   Accepted: 12760 Descripti ...

  2. Java程序员应更新的知识

    2013: 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二) 你应该更新的Java知识之Observer 你应该更新的Java知识之集合初始化 你应该更新的Jav ...

  3. swiper中提供的动画效果

    目前就只有这些,大家也可以尝试自己写一些想要的效果.动手试试,才能清楚每个效果具体是怎么回事~ bounce:弹跳两下出来flash:闪烁两下pulse:脉冲形式出来rubberBand:橡皮圈形式弹 ...

  4. 更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误

    更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误 我的本本是win7,雷凌网卡Ralink RT3290   802.1 ...

  5. HTML、canvas、video灰度

    效果图: 注:本例需在服务器上运行的才能看到效果.视频文件可换成本地视频(HBuilder有集成服务器或者使用wampmanager). 代码如下: <!DOCTYPE html> < ...

  6. HTTP协议详解--转载http://blog.csdn.net/gueter/article/details/1524447

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. Lua与C++相互调用

    {--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} ...

  8. Centreon插件nagvis

    ======================================= http://docs.nagvis.org/1.8/en_US/index.html https://document ...

  9. 原创:cellmap 基站查询 for android

    cellmap for android 3.6.8.7.9.8 更新日期:2016年12月30日 特别声明:本软件不能进行手机定位,不能对手机号码定位,谨防被骗. 下载地址: cellmap3.6.8 ...

  10. android国际化操作

    1.简单介绍 我们知道在java中通过.properties文件来配置资源文件,一般用的有中文message_zh_CN.properties和英文message_en_US.properties两个 ...