NHibernate系列文章八:NHibernate对象一级缓存
摘要
Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存。
一级缓存存在于Session对象里,也叫Session缓存,由Session进行管理。一级缓存是NHibernate内置的缓存。
二级缓存存在于SessionFactory对象里,也叫SessionFactory缓存,由SessionFactory进行管理,并且有大量的第三方dll对他进行扩展,他是一种“可插拔式”的缓存。
这一节主要讲一级缓存,后面一篇文章介绍二级缓存。
1. 一级缓存介绍
NHibernate一级缓存原理:
- NHibernate的Session对象在自己的内存中开辟”内存池“,这个“内存池”里存储持久化状态的NHibernate实体对象。这个内存池的结构是一个类似于IdentityMap的键值对集合,可以看做是.Net的字典对象。这个“内存池”就是一级缓存。
- 字典的键就是主键值,字典的值就是持久化对象。如果两个对象的主键值相等,则认为两对象相等。因此,如果映射结构里没有设置主键,NHibernate就无法管理Session的缓存,会报Exception。
- NHibernate查询从数据库里查询出NHibernate实体对象变成持久化状态,放在Session持久化对象缓存池里,之后访问该对象的时候就自动从缓存里读取。
- 一个NHibernate持久化状态实体对象只缓存在自己所属的Session里。
也就是说:
- 如果同一个Session两次查询同一个NHibernate实体,则第一次查询后将结果存入该session的缓存里,第二次查询使用Session缓存里的记录,只在第一次查询的时候执一次数据库查询。
- 如果两个Session对象查询同一个NHibernate实体则需要两次查询数据库,执行两次数据库查询。
2. 程序演示
1)在同一个session执行两次相同记录的查询
修改Main函数代码
static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); //在同一个session里执行两次相同记录的查询
using (var session = SessionFactory.OpenSession())
{
var customer1 = session.Get<Customer>();
var customer2 = session.Get<Customer>();
} Console.WriteLine("Completed");
Console.ReadLine();
}
打开NHibernateProfile监控,执行程序,得到结果,看到只执行了一次SQL查询
2)在不同session中执行两次相同记录的查询
修改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();
}
ctrl+x清空NHibernateProfile监控结果,执行程序,得到结果,执行了两次SQL查询。
3. 一级缓存补充
ISession接口为我们提供了一些方法来显式管理一级缓存。
- ISession.Evict(object):从缓存中删除指定实例
- ISession.Clear():清空缓存
- ISession.Contains(object):检查缓存中是否包含指定实例
NHibernate系列文章八:NHibernate对象一级缓存的更多相关文章
- NHibernate系列文章九:NHibernate对象二级缓存上
摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...
- NHibernate系列文章七:NHibernate对象状态
摘要 NHibernate对象持久化 NHibernate对象的三个状态:临时态.持久态.游离态(托管态) NHibernate三状态的相互转化 1. NHibernate对象持久化 NHiberna ...
- NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)
摘要 这篇文章介绍NHibernate最实用的内容:关系映射. NHibernate的关系映射方式有三种: Set:无序对象集合,集合中每一个元素不能重复. List:有序对象集合,集合中的元素可以重 ...
- NHibernate系列文章一:NHibernate介绍
摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...
- NHibernate系列文章十七:NHibernate Session管理(附程序下载)
摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...
- NHibernate系列文章目录
第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- NHibernate系列文章十一:NHibernate并发控制
摘要 在同一时刻数据访问量和更新次数比较大的系统中,产生了数据的并发访问问题.并发访问使得在这样的环境中,所有用户(程序.实际用户.进程.线程等)的操作不产生负面问题. 如果不使用并发,在两个用户同时 ...
随机推荐
- excel数据出入Oracle数据库(转)
1.先把你的表存为.CSV文件2.打开PL/SQL,新建一张字段和你EXCEL一样的表3.上方Tools——Text Importer——open datafile(左上角)——选择你的CSV表,打开 ...
- 复健小CM
系统 : Windows xp 程序 : Keygenme # 2 程序下载地址 :http://pan.baidu.com/s/1qYIk2HQ 要求 : 注册机编写 使用工具 : OD 可在“PE ...
- redis-persist上线
九月份惨不忍睹,因为代码质量不够高,直接被Boss喷成了筛子.被反复教育说要高质量的代码,要可维护.高性能…… 幸而,最后一周终于在紧张的加班中,灰度上线redis-land-go了,项目也改名为re ...
- PAT (Basic Level) Practise:1026. 程序运行时间
[题目链接] 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间.这个时间单位是clock t ...
- Understanding Linux /proc/cpuinfo
http://www.richweb.com/cpu_info A hyperthreaded processor has the same number of function units as a ...
- LEETCODE —— binary tree [Same Tree] && [Maximum Depth of Binary Tree]
Same Tree Given two binary trees, write a function to check if they are equal or not. Two binary tre ...
- ExtAspNet和FineUI未将对象引用设置到对象的实例
要在web.config中加入 <configSections> <section name="ExtAspNet" type="ExtAspNet.C ...
- 【转】关于.net framework4.0以及4.5安装失败,“安装时发生严重错误”……
也不知道管不管用,先记着 今天忽然想装一个vs2010,然后装了好几遍,每次都在安装.net4.0的时候失败.好吧,我自己手动装行么.于是手动去装.net 4.0. 结果在还是返回"安装时发 ...
- Angular1.x组件通讯方式总结
Angular1开发模式 这里需要将Angular1分为Angular1.5之前和Angular1.5两个不同的阶段来讲,两者虽然同属Angular1,但是在开发模式上还是有较大区别的.在Angula ...
- Struts2实现简单的在线人数统计
用Strust2框架的知识简单实现一个统计在线人数的问题. 1 搭建开发环境:(配置文件,jar包等问题) 2 index.jsp <%@ page language="java&qu ...