Hibernate 缓存原理与策略

一、Hibernate 缓存原理:

对于 Hibernate 这类 ORM 而言, 缓存显的尤为重要, 它是持久层性能提升的关键. 简单来讲 Hibernate 就是对 JDBC 进行封装, 以实现内部状态的管理, OR 关系的映射等, 但随之带来的就是数据访问效率的降低, 和性能的下降, 而缓存就是弥补这一缺点的重要方法.

缓存就是数据库数据在内存中的临时容器, 包括数据库数据在内存中的临时拷贝, 它位于数据库与数据库访问层中间. ORM 在查询数据时首先会根据自身的缓存管理策略, 在缓存中查找相关数据, 如发现所需的数据, 则直接将此数据作为结果加以利用, 从而避免了数据库调用性能的开销. 而相对内存操作而言, 数据库调用是一个代价高昂的过程.
一般来讲 ORM 中的缓存分为以下几类:
1: 事务级缓存: 即在当前事务范围内的数据缓存. 就 Hibernate 来讲, 事务级缓存是基于 Session 的生命周期实现的, 每个 Session 内部会存在一个数据缓存, 它随着 Session 的创建而存在, 随着 Session 的销毁而灭亡, 因此也称为 Session Level Cache.
2: 应用级缓存: 即在某个应用中或应用中某个独立数据库访问子集中的共享缓存, 此缓存可由多个事务共享 (数据库事务或应用事务), 事务之间的缓存共享策略与应用的事务隔离机制密切相关. 在 Hibernate 中, 应用级缓存由 SessionFactory 实现, 所有由一个 SessionFactory 创建的 Session 实例共享此缓存, 因此也称为 SessionFactory Level Cache.
3: 分布式缓存: 即在多个应用实例, 多个 JVM 间共享的缓存策略. 分布式缓存由多个应用级缓存实例组成, 通过某种远程机制 (RMI,JMS) 实现各个缓存实例间的数据同步, 任何一个实例的数据修改, 将导致整个集群间的数据状态同步.

二、Hibernate 的一,二级缓存策略:

Hibernate 中提供了两级 Cache,第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate 管理的,一般情况下无需进行干预;第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载,属于多事务级别,要防止事务并发性。

缓存是以 map 的形式进行存储的 (key-id,value-object)

一级缓存 (Session):

事务范围,每个事务 (Session) 都有单独的第一级缓存.

一级缓存的管理:当应用程序调用 Session 的 save()、update()、saveOrUpdate()、get() 或 load(),以及调用查询接口的 list()、iterate()–(用的是 n+1 次查询,先查 id) 或 filter() 方法时,如果在 Session 缓存中还不存在相应的对象,Hibernate 就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate 会根据缓存中对象的状态变化来同步更新数据库。 Session 为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象, flush(): 使缓存与数据库同步。

当查询相应的字段如 (name),而不是对象时,不支持缓存。

二级缓存 (SessionFactory):

Hibernate 的二级缓存策略的一般过程如下:

1: 条件查询的时候,总是发出一条 select * from table_name where …. (选择所有字段)这样的 SQL 句查询数据库,一次获得所有的数据对象 (这个问题要考虑,如果你查询十万条数据时,内存不是被占用)。

 2: 把获得的所有数据对象根据 ID 放入到第二级缓存中。

 3: 当 Hibernate 根据 ID 访问数据对象的时候,首先从 Session 一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照 ID 放入到缓存。

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

Hibernate 的二级缓存策略,是针对于 ID 查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate 提供了针对条件查询的 Query Cache。

Q: 什么样的数据适合存放到第二级缓存中?

1. 很少被修改的数据

2. 不是很重要的数据,允许出现偶尔并发的数据

3. 不会被并发访问的数据

4. 参考数据, 指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

 不适合存放到第二级缓存的数据?

1 经常被修改的数据

2 财务数据,绝对不允许出现并发

3 与其他应用共享的数据。

 常用的缓存插件 Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件

  EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对 Hibernate 的查询缓存提供了支持。

  OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对 Hibernate 的查询缓存提供了支持。

  SwarmCache:可作为群集范围内的缓存,但不支持 Hibernate 的查询缓存。

  JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对 Hibernate 的查询缓存提供了支持。

配置二级缓存的主要步骤:

  1 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。

  2 选择合适的缓存插件,然后编辑该插件的配置文件。

三、两种对比

这里写图片描述

四、三种状态

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值