摘要

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对象一级缓存的更多相关文章

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

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

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

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

  3. NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)

    摘要 这篇文章介绍NHibernate最实用的内容:关系映射. NHibernate的关系映射方式有三种: Set:无序对象集合,集合中每一个元素不能重复. List:有序对象集合,集合中的元素可以重 ...

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

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

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

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

  6. NHibernate系列文章目录

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

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

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

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

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

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

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

随机推荐

  1. 上下margin重叠传递问题

    我发现强迫症真的是我一个大病...每次都非得把所有情况都实验出来不可...BUT!!!!!!!!!悲催的是,这么多情况我根本记不住...还是要在写代码的时候不断出错再排错~受不了自己了!不过还是把这部 ...

  2. SQL 金额千分位显示

    第一种:select convert(varchar,cast(_money AS MONEY),1) AS _money -----带小数点的第二种: select reverse(stuff(re ...

  3. day12_API第二天

    1.Scanner注意问题 1.Scanner中方法                   next() -- 查找并返回来自此扫描器的下一个完整标记.           nextLine() -- ...

  4. c数据结构栈的基本操作(字符逆序输出)

    线性栈 输入字符,再输出 #include "stdafx.h" #include<stdlib.h> #include<malloc.h> #define ...

  5. hdu 1016

    这是一道考搜索的题目.这道题我用深搜解决了,不过说实话自己对于深搜理解得并不深刻,在这里对于这一题总结一下. 这道题输入为一个实数n,要求输出有1~n这n个数所组成的所有素数环(这是素数环),素数环的 ...

  6. poj1026 Cipher ——置换群

    link:http://poj.org/problem?id=1026 其实这道题目和poj2369这道题目一样. 都是基础的置换群题目.把那道题目理解了,这道题就没问题了. 不过我的方法貌似比较挫, ...

  7. dedecms recommend 注入 exp

    我看没人用python写过发过 所以我就发一下 喜欢用python的就用我这个吧 不喜欢的就用JAR那个或者PHP那个吧 #coding:GBK import  re import urllib &q ...

  8. android之下拉刷新(reflush)

    package com.example.reflush; import android.app.ListActivity; import android.os.Bundle; import andro ...

  9. ES TIPS

    1,Testing Analyzers Especially when you are new to Elasticsearch, it is sometimes difficult to under ...

  10. Nginx 下配置SSL证书的方法

    1.Nginx 配置 ssl 模块 默认 Nginx 是没有 ssl 模块的,而我的 VPS 默认装的是 Nginx 0.7.63 ,顺带把 Nginx 升级到 0.7.64 并且 配置 ssl 模块 ...