1,对象状态。

作为基础,还是先看一下对象的状态吧。主要涉及到三个名词,瞬时、持久、托管。

瞬时态:对象刚创建,Session还不知道这个对象的存在。可以通过调用ISession的Save等方法可以转变为持久态。

持久态:对象刚通过ISession的Get或Load加载,如果对象被修改,则在操作提交时,会将修改同步到数据库中。

托管态:程序中有这个对象,数据库中也有相应的记录,但该对象已经不被Session管理了。比如,通过ISession拿到一个对象后,管理了ISession,则刚才的对象出于托管态。处于托管态的对象可以被重新关联到某一个Session。

2,一级缓存。

NHibernate的缓存分为一级缓存和二级缓存。查询时也是按照“一级缓存 ->二级缓存 -> 数据库”的顺序进行查询的。以下截图来自《Working with NHibernate 3.0》

一级缓存是指保存在Session中的缓存,和其他Session是不共享的,也就是说每一个Session都有自己的缓存,并且只有自己可以访问,Session关闭则缓存失效。

ISession提供了一些方法可以显示的管理缓存:

ISession.Evict(object):从缓存中删除指定实例。

ISession.Clear():清空缓存。

ISession.Contains(object):检查缓存中是否包含指定实例。

3,二级缓存。

3.1,简介。

二级缓存有和SessionFactory一样的生命周期,并且默认是关闭的。

NHibernate默认提供的二级缓存是基于HashTable的NHibernate.Cache.HashtableCacheProvider。并且提供了ICacheProvicer接口供第三方缓存提供具体实现第三方实现的缓存还有如下方案:

Velocity: 基于微软的AppFabric的实现。

SharedCache:基于MergeSystem的分布式缓存组件。

SysCache:基于.net中System.Web.Caching.Cache的缓存。

SysCache2:和SysCache不同的是增加了Sql2005的缓存依赖的支持。

Prevalence:基于Bamboo.Prevalence的缓存组件。

MemCache:基于Memcached的分布式缓存的实现。

3.2,使用。

以使用HashtableCacheProvider为例。

首先在Session-factory节点添加配置:

<property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>

<property name="cache.use_second_level_cache">true</property>

<property name="cache.use_query_cache">true</property>

provider_class配置使用哪种缓存方案;use_second_level_cache:是否开启缓存;use_query_cache:是否开启查询缓存(下面会讨论)。

然后对于要使用缓存的实体加上如下注解:

Usage是要使用的缓存策略。Include: 可选,默认值是all,即所有都缓存,如果设置为non-lazy,则延迟加载

的属性不被缓存。region: 可选,默认值是类的名称,用来指定二级缓存的去域名。

以后查询时,该实体会被缓存。

3.3,查询缓存。

如果需要对一个方法的查询结果进行缓存,则可以使用查询缓存。

要使用查询,首先确保已经在配置中开启了查询缓存:<property name="cache.use_query_cache">true</property>。

然后在代码中需要使用缓存的地方调用IQueryable.Cacheable(),方法(或是IQuery.SetCacheable),NHibernate会根据查询参数组成一个CacheKey,将查询结果作为value,存入缓存。

查询缓存中的集合会根据数据库的更改而改变。

3.4,管理缓存。

ISessionFactory提供了以下方法供显示管理二级缓存:

Evict(persistentClass):从二级缓存中删除persistentClass类所有实例

Evict(persistentClass, id):从二级缓存中删除指定的持久化实例

EvictEntity(entityName):从二级缓存中删除命名实例

EvictCollection(roleName):从二级缓存中删除集合

EvictCollection(roleName, id):从二级缓存中删除指定的集合

EvictQueries():从二级缓存中清空全部查询结果集

EvictQueries(cacheRegion):从二级缓存中清空指定查询结果集

使用NHibernate(9)-- 缓存的更多相关文章

  1. [Nhibernate]二级缓存(一)

    目录 写在前面 文档与系列文章 二级缓存 Nhibernate二级缓存提供程序 一个例子 总结 写在前面 上篇文章介绍了nhibernate中一级缓存的相关内容,一级缓存过期时间和ISession对象 ...

  2. [Nhibernate]二级缓存(二)

    目录 写在前面 文档与系列文章 更新数据 二级缓存管理 总结 写在前面 本篇文章也算nhibernate入门系列的结尾了,在总结nhibernate系列的过程中,遇到了很多问题,学习的过程也是解决bu ...

  3. 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存

    一.准备工作 [1]根据操作系统(位数)选择下载相应版本的MemCache, MemCache的下载和安装,参看: http://www.cnblogs.com/easy5weikai/p/37606 ...

  4. [Nhibernate]二级缓存

    [Nhibernate]二级缓存 目录 写在前面 文档与系列文章 二级缓存 Nhibernate二级缓存提供程序 一个例子 总结 写在前面 上篇文章介绍了nhibernate中一级缓存的相关内容,一级 ...

  5. 基于NHibernate二级缓存的MongoDB组件

    设计一套基于NHibernate二级缓存的MongoDB组件(上)   摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence ...

  6. NHibernate二级缓存(第十一篇)

    NHibernate二级缓存(第十一篇) 一.NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享. 注意NHibernate查 ...

  7. [Nhibernate]一级缓存

    目录 写在前面 文档与系列文章 一级缓存 一个例子 一级缓存管理 总结 写在前面 上篇文章介绍了nhibernate中对象的三种状态,通过对象的三种状态,很容易想到缓存. 什麽是缓存? 有时候,某些数 ...

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

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

  9. NHibernate系列文章九:NHibernate对象二级缓存上

    摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...

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

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

随机推荐

  1. 使用虚幻引擎中的C++导论(二-UE4基类)

    使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

  2. mysql与oracle的存储过程有什么区别?

    MySQL存储过程 (1). 格式 MySQL存储过程创建的格式:CREATE PROCEDURE过程名 ([过程参数[,...]]) [特性 ...]过程体 案例分析: 参数 MySQL存储过程的参 ...

  3. Spark 集群安装

    一.安装jdk 二.安装scala 三.安装Spark 1.解压 tar -zxvf spark-1.5.1-bin-hadoop2.6.tgz 2.cp spark-env.sh.template ...

  4. javascript关于闭包变量作用域

    在项目中不时会遇到的一些小的问题以及解决办法: 1子函数调用父函数中的变量: 加return: var a=1; function num(){ var b=2; return b; } num()+ ...

  5. HttpUtility.UrlEncode

  6. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  7. 【228】◀▶ Excel 函数说明

    官方帮助:Excel 函数(按字母顺序列出) 官方帮助:Excel 函数(按类别列出) 参考:EXCEL常用函数大全 01   N_ELEMENTS 表达式或者变量的元素个数. 02   DEFSYS ...

  8. angularJS学习之旅(1)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. scala 学习:object 和class, trait

    object: Scala中没有静态修饰符,static,在object下的成员全部都是静态的,如果在类中声明了与该类相同的名字的object则该object是该类的"半生对象", ...

  10. POJ 1236-Network of Schools (图论-有向图强联通tarjan)

    题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...