hibernate一级缓存,二级缓存,三级缓存,缓存算法及配置。

什么是缓存(我的理解):在内存中开辟一块空间,把原来在硬盘上的东西,放到内存当中,当需要用到一些数据时,直接在内存中查找,而不是到硬盘上查找。这块内存中的空间就是缓存。缓存能提高程序的运行效率。

一级缓存(session级的缓存):在一个session中load同一个对象2次,load时,hibernate首先在session缓存中查找对象,如果没找到就到数据库中去load。因此,在同一个session中load一个对象2次,只会发出一条sql语句。而在2个session中load同一个对象则会发送2次sql语句。

二级缓存(session的公用缓存,sessionFactory级别的缓存,jvm级缓存):hibernate支持多种二级缓存,hibernate提供了一个HashTable,用于测试,不建议运用与产品中。

Hibernate支持的jvm级的缓存有如下:

org.hibernate.cache.HashtableCacheProvider(hibernate自带的用于测试的2级缓存。)

org.hibernate.cache.EhCacheProvider

org.hibernate.cache.OSCacheProvider

org.hibernate.cache.SwarmCacheProvider

org.hibernate.cache.TreeCacheProvider

在hibernate的配置文件中打开二级缓存如下:

        <!--

                                   
打开并配置二级缓存

        -->

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

 

 <property
name="cache.provider_class">org.hibernate.cache.EhCacheProvider

</property>

二级缓存适合放什么对象呢?

①经常被访问(这个对象经常被访问,如果每次都到数据库去取,会降低效率)

②改动不大(这个对象改动不大,如果改动较大,就可能造成缓存数据跟数据库中的数据不一致)

在hibernate3.5.4中,这样的配置会出现一个问题。就是加上打开缓存的2句话,   

sf=new AnnotationConfiguration().configure().buildSessionFactory();无法成功执行。问题还未解决。用hibernate自带的org.hibernate.cache.HashtableCacheProvider则可以正常执行。
 

 

③数量有限(如果这个类的对象太多,缓存就会很大。)

三级缓存(查询缓存):如果要使Query使用二级缓存,则需要打开查询缓存。事实上,三级缓存是基于二级缓存的,如:list(集合),默认情况,它只会往二级缓存中存放数据,查找时不会搜索二级缓存,这是因为查询条件会随时变化。有一种情况就是2次查询的条件是一样的,这是要想使用二级缓存,就必须打开查询缓存,打开方式如:

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

然后加上:setCachable(true)

缓存算法有:

LRU(Least Recently Used):这种算法是在每个对象中维护一个访问的时间变量,每次访问后,时间都会更新,当新的对象需要存放到缓存时,替换那个按时间排序最后的对象。

LFU(Least Frequently Used):这种算法是每个对象记录了对象访问的次数(即命中率),当新的对象需要存放到缓存时,替换那个访问次数最少的对象。

FIFO(First In First Out):这种算法是将缓存中的对象存放成一个数组,当新的对象需要存放到内存中是,替换最先存放到缓存的对象。

使用时通常在缓存配置文件中加入:MemoryStoreEvictionPolicy="LRU"

时间: 2024-08-31 20:53:32

hibernate一级缓存,二级缓存,三级缓存,缓存算法及配置。的相关文章

一级、二级和三级封锁协议简介

在运用X锁和S锁对数据对象加锁时,还需要约定一些规则 ,例如何时申请X锁或S锁.持锁时间.何时释放等.称这些规则为封锁协议(Locking Protocol).对封锁方式规定不同的规则,就形成了各种不同的封锁协议.不同的封锁协议,在不同的程度上为并发操作的正确调度提供一定的保证. 一.一级封锁协议 一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放.事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK). 一级封锁协议可以防止丢失修改,并保证事务T是可恢复的

hibernate 中的一级缓存 二级缓存

1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做"缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗.   缓存策略提供商: 提供了HashTable缓存,EHCache,OSCache,Swa

框架-hibernate中的“二级缓存”和“类集合二级缓存”有什么关系和区别?

问题描述 hibernate中的"二级缓存"和"类集合二级缓存"有什么关系和区别? hibernate中的"二级缓存"和"类集合二级缓存"有什么关系和区别?请言简意骇的解释一下这两个呢,可举些小例子,谢谢作答 解决方案 Hibernate的一二级缓存区别

java模拟hibernate一级缓存示例分享_java

纯Java代码模拟Hibernate一级缓存原理,简单易懂. 复制代码 代码如下: import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; public class LevelOneCache { //这个对象就是用来模拟hibernate一级缓存的 private static Map<Integer, Student> stus=new HashMap&l

javaweb-关于hibernate一级缓存问题。

问题描述 关于hibernate一级缓存问题. hibernate的list查询会向一级缓存里面放入数据,但是下次取数据的时候,却不会再一级缓存里面取 ,怎样可以令到list查询到一级缓存里面取数据? 解决方案 所谓的下一次是在同一个Session中还是在不同的Session中, 在同一个Session中当然可以获取得到 在不同的Session中当然不能获取了(因为另一个Session已经关闭了)

javaweb-关于hibernate一级缓存问题

问题描述 关于hibernate一级缓存问题 Team team = (Team) meaulInter.executeQueryById(Team.class, 1); System.out.println(team.getName()); Team team2 = (Team) meaulInter.executeQueryById(Team.class, 1); System.out.println(team2.getName()); 这段代码中,meaulInter类里面有一个查询方法,

MyBatis的一级缓存和二级缓存 以及 mybatis和ehcache缓存框架整合

查询缓存 缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 基本由此图可以看出,我们在每一层都需要相应的缓存. mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sql

缓存穿透、缓存并发、缓存失效之思路变迁缓存穿透、缓存并发、缓存失效之思路变迁

我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 一.缓存穿透     注: 上面三个图会有什么问题呢? 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 那这种问题有什么好办法解决呢? 要是有人利用不存在的key频

一起谈.NET技术,.Net下的分布式缓存--从Discuz!NT的缓存设计谈起

最近拜读了代振军同学写的关于Discuz!NT的缓存设计的一篇文章<Discuz!NT 缓存设计简析 [原创]>,颇有些想法,姑且写在这里让大家拍砖吧. 缓存真是个好东西,在大型的系统中可以有效地提升系统的速度,此乃废话就不多说了,在.Net 平台下面我把缓存从功用大致分为两类,数据对象缓存和页面输出缓存. 对于数据缓存来讲是由System.Web.Caching.Cache这个类来实现,可以从上下文对象Context.Cache 来获取这个对象的引用.而页面/控件输出缓存则是由.Net环境在