第一步骤:hibernate.cfg.xml文件补上如下配置:

<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" ><session-factory name="NHibernate.Test123456"><property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><property name="connection.connection_string"><!--用于测试自动生成数据库表(不自动生成数据库)--><!--<property name="hbm2ddl.auto">update</property>-->Server=(local);initial catalog=NHibernateSampleAutoCreateTable;Integrated Security=SSPI<!--Server=(local);initial catalog=NHibernateSample;Integrated Security=SSPI--></property><property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property><!--输出所有的SQL语句到控制台,一般开发打开这个--><property name="show_sql">true</property><!--整齐的SQL输出到控制台--><property name="format_sql">true</property><!--自动生成数据库表(不自动生成数据库)--><property name="hbm2ddl.auto">update</property><!--在数据表设计中如果采用了 bit 类型的字段,并且对应了业务类中类型为 bool 值,一定要如上设置下--><property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>     <!--=======加入Nhibernate自身的HashtabeCache的二级缓存配置=============================--><!--1.配置二级缓存提供程序--><property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property><!--2.显式启用二级缓存--><property name ="cache.use_second_level_cache">true</property><!--4.启动查询缓存--><property name="cache.use_query_cache">true</property><!--实体类所在的程序集--><mapping assembly="Model"/><!--3.配置映射的二级缓存--><class-cache class="Model.Customer,Model" usage="read-write"/><!--<collection-cache collection ="集合名称" region="默认集合名称"usage="read-write"/>--></session-factory>
</hibernate-configuration>

实体类上也可以配二级缓存策略,如:

Customer.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model" assembly="Model" default-lazy="true"><class name="Model.Customer, Model"table="Customer"discriminator-value="0" lazy="false"><!--1.这个不是必须的,因为在nhibernate.cfg.xml文件中已经有了一个总配置2.cache标签必须在id标签前面--><cache usage="read-write"/><!--unsaved-value="0" 主键表中不需要定义,而是需要在子表中定义--><id name="CustomerId"column="CustomerId"type="int" unsaved-value="0"><generator class="native" /><!-- unsaved-value used to be null and generator was increment in h2.0.3 --></id>
。。。。。。。。。。。。。。。<set name="Orders" table="Order"  lazy="true"generic="true"inverse="false" cascade="all"><!--二级缓存策略--><cache usage="read-write"/><key column="CustomerId" foreign-key="FK_CustomerOrders"/> <one-to-many class="Model.Order,Model"/></set></class>
</hibernate-mapping>

测试1:

二级缓存与Get方法+Lazy设置的关系:

测试图解:

经测试,得出如下结论:

Get方法+Lazy配置+二级缓存测试结果:

Customer.hbm.xml的<Set name="Orders"        Customer.hbm.xml的<Set name="Orders"

lazy="true">                   lazy="false">

<cache usage="read-write"/>                      <cache usage="read-write"/>

Customer数据库中Order个数等于零                   Get方法从二级缓存获取Customer                               Get方法从二级缓存获取Customer

Customer数据库中Order个数大于零                   Get方法从二级缓存获取Customer                               Get方法从不从二级缓存获取Customer

------------------------更新二级缓存测试---------------------------------------------------------------

测试更新-1:

前置条件:

1.Customer没Orders

2.

  <class name="Model.Customer, Model"table="Customer"discriminator-value="0" lazy="true"><!--1.这个不是必须的,因为在nhibernate.cfg.xml文件中已经有了一个总配置2.cache标签必须在id标签前面--><cache usage="read-write"/>

测试代码:

        [TestMethod]public void TestSessionFactoryCacheUpdateCustomerHavingNotOrders(){CustomerService customerService = new CustomerService();Customer customer = new Customer(){FirstName = "Test",LastName = "TestSessionFactoryCache",Age = 10};customerService.Add(customer);int customerId = customer.CustomerId;Console.WriteLine("第1次获取数据并且更新------------------------------:");Customer customerGet1 = customerService.Get(customerId);Console.WriteLine("更新前:Id:{0}-->FirtstName:{1}", customerGet1.CustomerId, customerGet1.FirstName);customerGet1.FirstName = "我是更新后的FirstName"; //修改FirstNamecustomerService.Update(customerGet1);  //保存更新得到数据库。
Console.WriteLine("更新后:Id:{0}-->FirtstName:{1}", customerGet1.CustomerId, customerGet1.FirstName);Console.WriteLine("第2次获取数据==============================:");Customer customerGet2 = customerService.Get(customerId);Console.WriteLine("Id:{0}-->FirtstName:{1}", customerGet2.CustomerId, customerGet2.FirstName);Console.WriteLine("第3次获取数据==============================:");Customer customerGet3 = customerService.Get(customerId);Console.WriteLine("Id:{0}-->FirtstName:{1}", customerGet3.CustomerId, customerGet3.FirstName);}

View Code

测试结果:

NHibernate: INSERT INTOCustomer(Version, Firstname, Lastname, Age) VALUES(@p0, @p1, @p2, @p3);selectSCOPE_IDENTITY();@p0 = 1 [Type: Int32 (0)],@p1 = 'Test' [Type: String (4000)],@p2 = 'TestSessionFactoryCache' [Type: String (4000)],@p3 = 10 [Type: Int32 (0)]
第1次获取数据并且更新------------------------------:
NHibernate: SELECTcustomer0_.CustomerId as CustomerId0_0_,customer0_.Version as Version0_0_,customer0_.Firstname as Firstname0_0_,customer0_.Lastname as Lastname0_0_,customer0_.Age as Age0_0_ FROMCustomer customer0_ WHEREcustomer0_.CustomerId=@p0;@p0 = 198 [Type: Int32 (0)]
NHibernate: SELECTorders0_.CustomerId as CustomerId1_,orders0_.OrderId as OrderId1_,orders0_.OrderId as OrderId1_0_,orders0_.Version as Version1_0_,orders0_.OrderDate as OrderDate1_0_,orders0_.CustomerId as CustomerId1_0_ FROM[Order] orders0_ WHEREorders0_.CustomerId=@p0;@p0 = 198 [Type: Int32 (0)]
更新前:Id:198-->FirtstName:Test
NHibernate: UPDATECustomer SETVersion = @p0,Firstname = @p1,Lastname = @p2,Age = @p3 WHERECustomerId = @p4 AND Version = @p5;@p0 = 2 [Type: Int32 (0)], @p1 = '我是更新后的FirstName' [Type: String (4000)], @p2 = 'TestSessionFactoryCache' [Type: String (4000)], @p3 = 10 [Type: Int32 (0)], @p4 = 198 [Type: Int32 (0)], @p5 = 1 [Type: Int32 (0)]
更新后:Id:198-->FirtstName:我是更新后的FirstName
第2次获取数据==============================:
Id:198-->FirtstName:我是更新后的FirstName
第3次获取数据==============================:
Id:198-->FirtstName:我是更新后的FirstName

View Code

---------------------------------------------------

测试更新-2

前置条件:

1.Customer有Orders

2.

    <set name="Orders" table="Order"  lazy="false"generic="true"inverse="false" cascade="all"><!--二级缓存策略--><cache usage="read-write"/><key column="CustomerId" foreign-key="FK_CustomerOrders"/> <one-to-many class="Model.Order,Model"/></set>

测试代码和结果:表明2级缓存失效

        [TestMethod]public void TestSessionFactoryCacheUpdateCustomerHavingOrders(){CustomerService customerService = new CustomerService();Customer customer = new Customer(){FirstName = "Test",LastName = "TestSessionFactoryCache",Age = 10};Order order1 = new Order(){OrderDate = DateTime.Now,Customer = customer};customer.Orders.Add(order1);customerService.Add(customer);int customerId = customer.CustomerId;Console.WriteLine("第1次获取数据并且更新------------------------------:");Customer customerGet1 = customerService.Get(customerId);Console.WriteLine("更新前:Id:{0}-->FirtstName:{1}", customerGet1.CustomerId, customerGet1.FirstName);customerGet1.FirstName = "我是更新后的FirstName"; //修改FirstNamecustomerService.Update(customerGet1);  //保存更新得到数据库。
Console.WriteLine("更新后:Id:{0}-->FirtstName:{1}", customerGet1.CustomerId, customerGet1.FirstName);Console.WriteLine("第2次获取数据==============================:");Customer customerGet2 = customerService.Get(customerId);Console.WriteLine("Id:{0}-->FirtstName:{1}", customerGet2.CustomerId, customerGet2.FirstName);Console.WriteLine("第3次获取数据==============================:");Customer customerGet3 = customerService.Get(customerId);Console.WriteLine("Id:{0}-->FirtstName:{1}", customerGet3.CustomerId, customerGet3.FirstName);}

View Code

NHibernate: INSERT INTOCustomer(Version, Firstname, Lastname, Age) VALUES(@p0, @p1, @p2, @p3);selectSCOPE_IDENTITY();@p0 = 1 [Type: Int32 (0)],@p1 = 'Test' [Type: String (4000)],@p2 = 'TestSessionFactoryCache' [Type: String (4000)],@p3 = 10 [Type: Int32 (0)]
NHibernate: INSERT INTO[Order] (Version, OrderDate, CustomerId)
VALUES(@p0, @p1, @p2);selectSCOPE_IDENTITY();@p0 = 1 [Type: Int32 (0)],@p1 = 2014/5/29 23:15:57 [Type: DateTime (0)],@p2 = 199 [Type: Int32 (0)]
第1次获取数据并且更新------------------------------:
NHibernate: SELECTcustomer0_.CustomerId as CustomerId0_0_,customer0_.Version as Version0_0_,customer0_.Firstname as Firstname0_0_,customer0_.Lastname as Lastname0_0_,customer0_.Age as Age0_0_ FROMCustomer customer0_ WHEREcustomer0_.CustomerId=@p0;@p0 = 199 [Type: Int32 (0)]
NHibernate: SELECTorders0_.CustomerId as CustomerId1_,orders0_.OrderId as OrderId1_,orders0_.OrderId as OrderId1_0_,orders0_.Version as Version1_0_,orders0_.OrderDate as OrderDate1_0_,orders0_.CustomerId as CustomerId1_0_ FROM[Order] orders0_ WHEREorders0_.CustomerId=@p0;@p0 = 199 [Type: Int32 (0)]
更新前:Id:199-->FirtstName:Test
NHibernate: UPDATECustomer SETVersion = @p0,Firstname = @p1,Lastname = @p2,Age = @p3 WHERECustomerId = @p4 AND Version = @p5;@p0 = 2 [Type: Int32 (0)], @p1 = '我是更新后的FirstName' [Type: String (4000)], @p2 = 'TestSessionFactoryCache' [Type: String (4000)], @p3 = 10 [Type: Int32 (0)], @p4 = 199 [Type: Int32 (0)], @p5 = 1 [Type: Int32 (0)]
NHibernate: UPDATE[Order] SETVersion = @p0,OrderDate = @p1,CustomerId = @p2 WHEREOrderId = @p3 AND Version = @p4;@p0 = 2 [Type: Int32 (0)], @p1 = 2014/5/29 23:15:57 [Type: DateTime (0)], @p2 = 199 [Type: Int32 (0)], @p3 = 34 [Type: Int32 (0)], @p4 = 1 [Type: Int32 (0)]
更新后:Id:199-->FirtstName:我是更新后的FirstName
第2次获取数据==============================:
NHibernate: SELECTorder0_.OrderId as OrderId1_0_,order0_.Version as Version1_0_,order0_.OrderDate as OrderDate1_0_,order0_.CustomerId as CustomerId1_0_ FROM[Order] order0_ WHEREorder0_.OrderId=@p0;@p0 = 34 [Type: Int32 (0)]
Id:199-->FirtstName:我是更新后的FirstName
第3次获取数据==============================:
NHibernate: SELECTorder0_.OrderId as OrderId1_0_,order0_.Version as Version1_0_,order0_.OrderDate as OrderDate1_0_,order0_.CustomerId as CustomerId1_0_ FROM[Order] order0_ WHEREorder0_.OrderId=@p0;@p0 = 34 [Type: Int32 (0)]
Id:199-->FirtstName:我是更新后的FirstName

View Code

将该测试(测试更新-2)的前置条件2改为:

lazy="true"  ,即修改后的配置如下:  
    <set name="Orders" table="Order"  lazy="true"generic="true"inverse="false" cascade="all"><!--二级缓存策略--><cache usage="read-write"/><key column="CustomerId" foreign-key="FK_CustomerOrders"/> <one-to-many class="Model.Order,Model"/></set>

lazy="true" 时,2级缓存生效,测试结果如下所示:

NHibernate: INSERT INTOCustomer(Version, Firstname, Lastname, Age) VALUES(@p0, @p1, @p2, @p3);selectSCOPE_IDENTITY();@p0 = 1 [Type: Int32 (0)],@p1 = 'Test' [Type: String (4000)],@p2 = 'TestSessionFactoryCache' [Type: String (4000)],@p3 = 10 [Type: Int32 (0)]
NHibernate: INSERT INTO[Order] (Version, OrderDate, CustomerId)
VALUES(@p0, @p1, @p2);selectSCOPE_IDENTITY();@p0 = 1 [Type: Int32 (0)],@p1 = 2014/5/29 22:55:43 [Type: DateTime (0)],@p2 = 193 [Type: Int32 (0)]
第1次获取数据并且更新------------------------------:
NHibernate: SELECTcustomer0_.CustomerId as CustomerId0_0_,customer0_.Version as Version0_0_,customer0_.Firstname as Firstname0_0_,customer0_.Lastname as Lastname0_0_,customer0_.Age as Age0_0_ FROMCustomer customer0_ WHEREcustomer0_.CustomerId=@p0;@p0 = 193 [Type: Int32 (0)]
更新前:Id:193-->FirtstName:Test
NHibernate: UPDATECustomer SETVersion = @p0,Firstname = @p1,Lastname = @p2,Age = @p3 WHERECustomerId = @p4 AND Version = @p5;@p0 = 2 [Type: Int32 (0)], @p1 = '我是更新后的FirstName' [Type: String (4000)], @p2 = 'TestSessionFactoryCache' [Type: String (4000)], @p3 = 10 [Type: Int32 (0)], @p4 = 193 [Type: Int32 (0)], @p5 = 1 [Type: Int32 (0)]
更新后:Id:193-->FirtstName:我是更新后的FirstName
第2次获取数据==============================:
Id:193-->FirtstName:我是更新后的FirstName
第3次获取数据==============================:
Id:193-->FirtstName:我是更新后的FirstName

View Code

经测试,得出如下结论:

Update方法+Get方法+Lazy配置+二级缓存测试结果:

Customer.hbm.xml的<Set name="Orders"                 Customer.hbm.xml的<Set name="Orders"

lazy="true">                   lazy="false">

<cache usage="read-write"/>                      <cache usage="read-write"/>

----------------------------------------------------------------------------------------------------------------------------------------

Customer数据库中Order个数等于零                 用 Update方法Customer后,                           用 Update方法Customer后,

Get方法从二级缓存获取Customer                     Get方法从二级缓存获取Customer

-----------------------------------------------------------------------------------------------------------------------------------------

Customer数据库中Order个数大于零                   用 Update方法Customer后                              用 Update方法Customer后

                  Get方法从二级缓存获取Customer                        Get方法从不从二级缓存获取Customer

 

-----------------------------------------------------------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/easy5weikai/p/3759277.html

01-08-02【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider...相关推荐

  1. 设计一套基于NHibernate二级缓存的MongoDB组件(上)

    摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence等等,但是没有MongoDB的,于是自己扩展了一个支持MongoDB的缓 ...

  2. Python50图之01散点图 02气泡图

    第一期 关联图:01 散点图 & 02 气泡图 2018年12月,大佬博主Selva Prabhakaran在自己运营的机器学习网站MachineLearning Plus上发布了博文:Pyt ...

  3. 菊安酱与菜菜的Python机器学习可视化(week1 correlation - 01散点图 02气泡图)

    文章目录 第一期 关联图:01 散点图 & 02 气泡图 博文非常优秀,但是同时..... **菊安酱和菜菜不希望看到这篇优秀文章被浪费掉!** 在接下来的8周之内,我们将会带领你一起遍历50 ...

  4. 有趣的数学计算  1/9801 (结果 00,01,02,03。。。97)(使用到 BigDecimal )

    有趣的数学计算  1/9801 结果 00,01,02,03...97 ■代码 package com.sxz.demo;import java.math.BigDecimal; import jav ...

  5. java 01 02_Java知识系统回顾整理01基础02面向对象01类和对象

    一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...

  6. 《安富莱嵌入式周报》第251期:2022.01.31--2022.02.06

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  7. Nodeparty-SZ-1 深圳聚会活动回顾总结[2012.01.08] - CNode

    Nodeparty-SZ-1 深圳聚会活动回顾总结[2012.01.08] - CNode Nodeparty-SZ-1 深圳聚会活动回顾总结[2012.01.08] - CNode Nodepart ...

  8. 从报文角度看modbus功能码01,02,03,04的区别

    从报文角度看modbus功能码01,02,03,04的区别 01 02功能码属于位操作指令,读取的是1 bit的数据,03 04功能码属于字操作指令,读取的寄存器的数据. 以读报文为例: 01,02: ...

  9. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。

    编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00.01.02--98.99每间隔500ms加1显示. 程序: #include <reg51.h> ...

最新文章

  1. JVM 调优实战--jmap的使用以及内存溢出分析
  2. VTK:图片之DotProduct
  3. 数据结构链表之栈,Python3简单实现——5
  4. c4d启动无反应_浙江无填料喷雾式冷却塔
  5. 基础编程题目集 6-7 统计某类完全平方数 (20 分)
  6. 小技巧 ----- Java中的进制转换
  7. Git学习笔记之廖雪峰Git教程
  8. MEGA2560 arduino烧录USB 芯片flash以及bootloader记录
  9. Pytroch常用损失函数总结
  10. Linux系统之查找文件和打包压缩文件
  11. win8.1电脑显示器亮度按钮无法使用
  12. IBM笔记本使用法语输入法,如何键入法语特殊字符?
  13. 天涯明月刀无法显示服务器,天涯明月刀登录不进去怎么办 pc端手机端服务器已满怎么解决_游戏369...
  14. 教学管理系统-实验四 顺序图
  15. 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
  16. 华为云-容器引擎CCE-部署Nginx应用
  17. 怎样使MathType插入章节标记不显示
  18. Android ListView按下效果显示问题
  19. OD调试中的小技巧--一点点总结,大佬请绕行
  20. windows平台上的密码算法识别工具

热门文章

  1. 程序员面试金典 - 面试题 01.01. 判定字符是否唯一(位运算,牛)
  2. LeetCode 229. 求众数 II(摩尔投票)
  3. oracle获取今天凌晨的时间_oracle查询日期语句有哪些?
  4. 2018年计算机CPU纳米制程,AMD发大招,推出7纳米制程CPU与GPU
  5. Java充电宝模型设计_继续探讨点赞功能模块设计
  6. 如何让二维码自适应浏览器的尺寸
  7. 7.MongoDB与python交互
  8. 二叉排序树删除子节点以及遍历
  9. 中文验证码 php_还在苦恼验证码怎么实现?看看这个验证码组件合集,你想要的都有...
  10. EMNLP'21 | 让压缩语言模型自动搜索最优结构!