什么是二级缓存?

  NHibernate的Session提供了一级缓存。每个Session,对同一个id进行两次Load,不会发送两条SQL语句给数据库,但是Session一但关闭,一级缓存也就失效了。

  与Session相对的是,SessionFactory也提供了相应的缓存机制。

  SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存。

  SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在NHibernate初始化阶段根据映射元数据推导出来的。

  SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,

  因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的副本,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的二级缓存。

  NHibernate的二级缓存的实现原理与一级缓存是一样的,也是通过以ID为key的Map来实现对对象的缓存。 由于NHibernate的二级缓存是作用在SessionFactory范围内的,是一种全局缓存,因而它比一级缓存的范围更广,可以被所有的Session对象所共享。

  二级缓存的工作内容

NHibernate的二级缓存同一级缓存一样,也是针对对象id来进行缓存。所以说,二级缓存的作用范围是针对根据id获得对象的查询。

二级缓存的工作可以概括为以下几个部分:

在执行各种条件查询时,如果所获得的结果集为实体对象的集合,那么就会把所有的数据对象根据id放入到二级缓存中。

当NHibernate根据id访问数据对象的时候,首先会从Session一级缓存中查找,如果查不到并且配置了二级缓存,那么会从二级缓存中查找,如果还查不到,就会查询数据库,把结果按照id放入到缓存中。

删除、更新、增加数据的时候,同时更新缓存。

  缓存策略
  只读缓存(read-only),读/写缓存(read-write),不严格的读/写缓存(nonstrict-read-write)

  下面我就针对二级缓存的使用场景举个例子:在操作数据库的时候,常会用到事务。在使用事务begin tran而没有立刻执行commit或者rollback的时候,查询表中的数据,这时有些数据将无法获取,只有等到事务执行完毕时才会查询出这些数据。如果有长事务,甚至会出现“超时”的现象。(见下图)

  换句话说,当数据库服务器遇到大并发时,没有缓存机制是很可怕的。而一级缓存仅仅只是针对Session,为了解决这类问题,则需要一种全局的缓存——二级缓存。配置了二级缓存后,查询和伴随事务的增删改操作将不受影响。

  NHibernate的二级缓存组建有MemCache、Prevalence、SharedCache、SysCache、SysCache2、Velocity。今天主要介绍Prevalence的使用。

  1.加入Bamboo.Prevalence.dll、Bamboo.Prevalence.Util.dll、NHibernate.Caches.Prevalence.dll这三个程序集。

  下载地址 http://sourceforge.net/projects/nhcontrib/files/

  2.在NHibernate的映射文件加入节点<cache usage="read-write"/>的配置项。

   3.配置Spring.Data.NHibernate.LocalSessionFactoryObject对象的HibernateProperties属性:

    ⑴.加入<entry key="cache.use_second_level_cache" value="true"/>,启用二级缓存。

    ⑵.加入<entry key="expiration" value="300" />,设置二级缓存的有效时间,默认情况为300秒。

    ⑶.加入<entry key="prevalenceBase" value="d:\cache" />,设置物理缓存文件的存放位置,

      注意的是目前不支持相对路径,不然在开发环境会加到IDE的目录下,在部署时会加到system32/inetsrv/下。

hibernate-mapping

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
  <class name="Domain.Department, Domain" table="T_Department" lazy="true" >
    
    <cache usage="read-write" />
    
    <id name="DepartmentID" column="DepartmentID" type="Int32" >
      <generator class="native" />
    </id>

<property name="Name" type="String">
      <column name="Name" length="50" not-null="true"></column>
    </property>

<bag name="PersonList" inverse="true" lazy="true" generic="true" cascade="all-delete-orphan" table="T_Person">
      <cache usage="read-write" />
      <key column="DepartmentID" foreign-key="FK_Person_Department"/>
      <one-to-many class="Domain.Person, Domain" />
    </bag>

</class>
</hibernate-mapping>

NHibernate Configuration

  <!-- NHibernate Configuration -->
  <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate21">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="MappingAssemblies">
      <list>
        <value>Domain</value>
      </list>
    </property>
    <property name="HibernateProperties">
      <dictionary>
        <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
        <entry key="dialect" value="NHibernate.Dialect.SQLiteDialect"/>
        <entry key="connection.driver_class" value="NHibernate.Driver.SQLite20Driver"/>
        <!--<entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
        <entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>-->
        <entry key="use_outer_join" value="true"/>
        <entry key="show_sql" value="true"/>
        <entry key="hbm2ddl.auto" value="update"/>
        <entry key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N'"/>
        <entry key="proxyfactory.factory_class" value="NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu"/>

<entry key="cache.use_second_level_cache" value="true"/>
        <entry key="cache.default_expiration" value="300"/>
        <entry key="prevalenceBase" value="cache" />
        <entry key="expiration" value="300" />
        <entry key="cache.provider_class" value="NHibernate.Caches.Prevalence.PrevalenceCacheProvider, NHibernate.Caches.Prevalence"/>
      </dictionary>
    </property>

<!-- provides integation with Spring's declarative transaction management features -->
    <property name="ExposeTransactionAwareSessionFactory" value="true" />

</object>

OK,以前三步配置即可实现二级缓存。

代码下载

转载于:https://www.cnblogs.com/GoodHelper/archive/2010/05/19/SpringNet_NHbernate_Prevalence.html

Spring.NET实用技巧1——基于Prevalence下的NHibernate二级缓存使用技巧相关推荐

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

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

  2. 专业计算机能力考试 技巧,计算机二级考试复习技巧

    全国专业技术人员计算机应用能力考试(以下简称职称计算机考试)是专业技术人才选拔和评价的重要手段.下面是学习啦小编为大家整理的计算机二级考试复习技巧,供大家分享. 计算机二级考试复习技巧:选择题 选择题 ...

  3. 程序员都会用到的13个Spring MVC实用技巧,收藏!!!

    通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet ...

  4. Spring.NET实用技巧3——NHibernate分布式事务(上)

    在使用NHibernate作为持久层框架时,多数据库操作是一个比较难解决的问题.并且很多网友在给我发的eamil中经常谈到此问题.由于NHibernate是一种框架,不能像ADO.NET那样直接用SQ ...

  5. 基于Windows下的Web性能测试和压力测试

    基于Windows下的Web性能测试和压力测试 Web测试 随着Internet的日益普及,现在基于B/S结构的大型应用越来越多,可如何对这些应用进行测试成为日益迫切的问题.有许多测试人员来信问我B/ ...

  6. Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧

    在开发Windows Phone应用程序的时候,或多或少会与图片打交道,下面总结下Windows Phone 中处理图片的一些技巧 1.  图片格式. 2.  图片编译方式 3.  图片加载方式 4. ...

  7. linux中网页播放音乐,Linux_在Linux系统下播放网页中的背景音乐技巧,在Linux中的firefox浏览许多网页 - phpStudy...

    在Linux系统下播放网页中的背景音乐技巧 在Linux中的firefox浏览许多网页时,很多使用了基于WMP的背景音乐播放器,如部份baidu空间.但firefox默认不支持播放. 在LINUX的源 ...

  8. Spring IOC容器-Bean管理——基于XML方式

    Spring IOC容器-Bean管理--基于XML(续集) 1.IOC 操作 Bean 管理(FactoryBean) ​ 1).Spring 有两种类型 bean,一种普通 bean,另外一种工厂 ...

  9. vue.js bootstrap 下拉列表_Excel下拉菜单制作的小技巧

    在工作中,常常需要对多行多列的数据设置下拉菜单,但在使用数据验证,设置下拉菜单时,序列来源是不能执行引用多行多列区域的,否则即会出现下图提示框,应该如何进行设置呢? 第一步:定义名称框 鼠标依次点击公 ...

  10. Linux系统下计算机C语言的编程技巧

    C语言在多程序编辑中发挥着基础性作用,并在国际范围得到了全面应用.科技的蓬勃发展,使得人们更加重视C语言技术,并对C语言提出更多的要求.但Linux系统是最主要的操作系统之一,基于此开展C语言编程工作 ...

最新文章

  1. [置顶] 当我拿车钥匙的时候,刚交的女朋友跑了。。。
  2. java opencv 图片放大缩小,角点检测和边缘检测(14)
  3. 深入浅出学习Struts框架(八):分析Struts框架实例3
  4. 成功解决AttributeError: 'DataFrame' object has no attribute 'tolist'
  5. windows docker 空出C盘 迁移到其他盘
  6. css属性基础以及wxss——居中,渐变色边框,圆角边框,横向布局,重叠div,div固定在底部,input的无边框显示下划线
  7. mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...
  8. 加个ing是什么意思_用quot;ing形式quot; 统称 动名词 和 现在分词 可以吗
  9. Nacos教程_2 讲解
  10. JVM学习(1)——通过实例总结Java虚拟机的运行机制
  11. 苹果该怎么办?特朗普誓言将会严厉惩罚外迁公司
  12. CentOS 6.5静态IP的设置(NAT和桥接联网方式都适用)
  13. 第二章 软件项目立项与规划
  14. 应对雾霾,哪款口罩适合你?
  15. 【EntityFramework CodeFirst 】错误解析:LINQ to Entities does not recognize the method ToString
  16. 计算机上机考试可以粘贴复制吗,急!高会无纸化考试打字慢 该如何复制粘贴?...
  17. linux中C编译命令,linux下命令行下编译c程式
  18. 基于单目视觉的平面目标定位和坐标测量 (下) - 相机姿态估计和目标测量
  19. 你的跑步姿势正确吗? 教你正确跑步姿势 常识
  20. python---引用其他py文件中的函数

热门文章

  1. 【一分钟知识】七种损失函数
  2. 一道快手面试题,击败了100%用户
  3. 每日算法系列【LeetCode 319】灯泡开关
  4. 分享一些自用软件,学妹们用了都说好用!
  5. 力扣每日一刷--验证回文串
  6. 电子商务数据运营的五大应用
  7. 当我们在讨论机器学习时我们在说些什么?
  8. Scala:函数式编程之下划线underscore
  9. 数字化定量分析_制造业走向数字化:企业以提高劳动生产率来优化供应链管理...
  10. 百度竞价点击器_同等预算,百度竞价托管如何让您的点击量高于您同行?