×

细说Hibernate的缓存机制_hibernate缓存机制

前端技术网 前端技术网 发表于2024-01-29 06:05:52 浏览3141 评论0

抢沙发发表评论

一、什么是hibernate中的二级缓存

第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预。第二级别的缓存是SessionFactory级别的缓存,是属于进程范围的缓存。

二级缓存也分为了两种

细说Hibernate的缓存机制_hibernate缓存机制

内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是只读的。

外置缓存:通常说的二级缓存也就是外置缓存,在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的**,外置缓存的物理介质可以是内存或者硬盘。

hibernate二级缓存的结构

2.并发访问策略

transactional

(事务型)

细说Hibernate的缓存机制_hibernate缓存机制

仅在受管理的环境中适用

提供Repeatable Read事务隔离级别

适用经常被读,很少修改的数据

可以防止脏读和不可重复读的并发问题

缓存支持事务,发生异常的时候,缓存也能够回滚

read-write

(读写型)

提供Read Committed事务隔离级别

在非集群的环境中适用

适用经常被读,很少修改的数据

可以防止脏读

更新缓存的时候会锁定缓存中的数据

nonstrict-read-write

(非严格读写型)

适用极少被修改,偶尔允许脏读的数据(两个事务同时修改数据的情况很少见)

不保证缓存和数据库中数据的一致性

为缓存数据设置很短的过期时间,从而尽量避免脏读

不锁定缓存中的数据

read-only

(只读型)

适用从来不会被修改的数据(如参考数据)

在此模式下,如果对数据进行更新操作,会有异常

事务隔离级别低,并发性能高

在集群环境中也能完美运作

分析:通过上述表格分析如下

适合放入二级缓存中数据

很少被修改

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

不适合放入二级缓存中的数据

经常被修改

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

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

二、Hibernate缓存机制

缓存是位于应用程序与物理数据源之间用于临时存放**数据的内存区域目的是为了减少应用程序对物理数据源访问的次数从而提高应用程序的运行性能

Hibernate在查询数据时首先到缓存中去查找如果找到就直接使用找不到的时候就会从物理数据源中检索所以把频繁使用的数据加载到缓存区后就可以大大减少应用程序对物理数据源的访问使得程序的运行性能明显的提升

Hibernate缓存分类

Session缓存一级缓存

SessionFactory的缓存分为内置缓存和外置缓存内置缓存中存放的是SessionFactory对象的一些**属性包含的数据(映射元素据及预定义SQL语句等)对于应用程序来说它是只读的外置缓存中存放的是数据库数据的副本其作用和一级缓存类似二级缓存除了以内存作为存储介质外还可以选用硬盘等外部存储设备

Hibernate的缓存范围

Hibernate的一级缓存和二级缓存都位于均位于持久层且均用于存放数据库数据的副本最大的区别就是缓存的范围各不一样

缓存的范围分为类:

事务范围

事务范围的缓存只能被当前事务访问每个事务都有各自的缓存缓存内的数据通常采用相互关联的对象形式缓存的生命周期依赖于事务的生命周期只有当事务结束时缓存的生命周期才会结束事务范围的缓存使用内存作为存储介质一级缓存就属于事务范围

应用范围

应用程序的缓存可以被应用范围内的所有事务共享访问缓存的生命周期依赖于应用的生命周期只有当应用结束时缓存的生命周期才会结束应用范围的缓存可以使用内存或硬盘作为存储介质二级缓存就属于应用范围

集群范围

在集群环境中缓存被一个机器或多个机器的进程共享缓存中的数据被**到集群环境中的每个进程节点进程间通过远程通信来保证缓存中的数据的一致缓存中的数据通常采用对象的松散数据形式

Hibernate的缓存管理

一级缓存的管理:

evit(Object obj)将指定的持久化对象从一级缓存中清除释放对象所占用的内存资源指定对象从持久化状态变为脱管状态从而成为游离对象

clear()将一级缓存中的所有持久化对象清除释放其占用的内存资源

contains(Object obj)判断指定的对象是否存在于一级缓存中

flush()刷新一级缓存区的内容使之与数据库数据保持同步

二级缓存的管理:

evict(Class arg Serializable arg)将某个类的指定ID的持久化对象从二级缓存中清除释放对象所占用的资源

Java代码

sessionFactory evict(Customer class new Integer());

evict(Class arg)将指定类的所有持久化对象从二级缓存中清除释放其占用的内存资源

Java代码

sessionFactory evict(Customer class);

evictCollection(String arg)将指定类的所有持久化对象的指定**从二级缓存中清除释放其占用的内存资源

Java代码

sessionFactory evictCollection( Customer orders);

Hibernate的二级缓存的配置

首先不是所有的数据都适合放在二级缓存中看一下什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?

下面这几种情况就不适合加载到二级缓存中:

经常被修改的数据

绝对不允许出现并发访问的数据

与其他应用共享的数据

下面这己种情况合适加载到二级缓存中:

数据更新频率低

允许偶尔出现并发问题的非重要数据

不会被并发访问的数据

常量数据

不会被第三方修改的数据

Hibernate的二级缓存功能是靠配置二级缓存插件来实现的 Hibernate为了集成这些插件 Hibernate提供了 hibernate cache CacheProvider借口它充当缓存插件与Hibernate之间的适配器

常用的二级缓存插件

EHCache hibernate cache EhCacheProvider

OSCache hibernate cache OSCacheProvider

SwarmCahe hibernate cache SwarmCacheProvider

JBossCache hibernate cache TreeCacheProvider

简单介绍一下EHCache的配置

hibernate cfg xml

Xml代码

<hibernate configuration>

<session factory>

<!设置二级缓存插件EHCache的Provider类>

<property name= hibernate cache provider_class>

hibernate cache EhCacheProvider

</property>

<!启动查询缓存>

<property name= hibernate cache use_query_cache>

true

</property>

</session factory>

</hibernate configuration>

ehcache xml

Xml代码

<ehcache>

<! maxElementsInMemory为缓存对象的最大数目 eternal设置是否永远不过期 timeToIdleSeconds对象处于空闲状态的最多秒数 timeToLiveSeconds对象处于缓存状态的最多秒数>

<diskStore path= java io tmpdir/>

<defaultCache maxElementsInMemory= eternal= false timeToIdleSeconds= timeToLiveSeconds= overflowToDisk= true/>

</ehcache>

**** hbm xml

Xml代码

<?xml version= encoding= UTF?>

<!DOCTYPE hibernate mapping PUBLIC

//Hibernate/Hibernate Mapping DTD//EN

mapping dtd>

<hibernate mapping>

<class>

<!设置该持久化类的二级缓存并发访问策略 read only read write nonstrict read write transactional>

<cache usage= read write/>

</class>

lishixinzhi/Article/program/Java/ky/201311/28418

三、hibernate缓存机制的简介

缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。

Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些**属性包含的数据,后者是指Session的一些**属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

Hibernate的这两级缓存都位于持久化层,存放的都是数据库数据的拷贝,为了理解二者的区别,需要深入理解持久化层的缓存的两个特性:缓存的范围和缓存的并发访问策略。

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!