hibernate缓存介绍

Hibernate三级缓存


一级缓存(session级别缓存):


 1、session关闭后,缓存就没了;hibernate发出一条sql查询,若缓存中没有,则从数据库中查,查到之后放入缓存


 2、以id为key值缓存对象






二级缓存(sessionFactory级别缓存):


 1.hibernate没有提供相应的二级缓存组件,所以需要额外的二级缓存包EHcache


 2.hibernate二级缓存存的仅仅是对象,就算只想查询这个对象的某几个属性,还是会把这个对象的所有信息查询出来。


 3.当一级缓存关闭之后,一级缓存就失效了,若这个对象配置了二级缓存,就算session关闭,hibernate会从二级缓存(sessionFactory)中查到数据。










三级缓存(查询缓存:sessionFactory级别):


 1、查询缓存是专门针对各种查询操作进行缓存。查询缓存会在整个SessionFactory的生命周期中起作用,存储的方式也是采用key-value的形式来进行存储的。


       2、查询缓存中的key是根据查询的语句、查询的条件、查询的参数和查询的页数等信息组成的。而数据的存储则会使用两种方式,使用SELECT语句只查询实体对象的某些列或者某些实体对象列的组合时,会直接缓存整个结果集。而对于查询结果为某个实体对象集合的情况则只会缓存实体对象的ID值,以达到缓存空间可 以共用,节省空间的目的。


      3、在使用查询缓存时,除了需要设置hibernate.cache.provider_class参数来启动二级缓存外,还需要通过hibernate.cache.use_query_cache参数来启动对查询缓存的支持。






注:缓存一般只对查询比较对,更改比较少的数据进行设置,若修改较多反而会影响hibernate的效率。


-------------------------------------------------------------------------------------------\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\






 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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值