hibernate 缓存机制

Hibernate提供了三个级别的缓存策略:Session缓存(基本的事务级缓存),Query Cache(查询缓存),Seond-Level Cache(二级缓存)

Session缓存(First-Level Cache):Session是Hibernate用于管理持久化对象的核心机制,它是针对持久性数据的事务级缓存。PersistenceContext中包括:

entityKeys,collectionKeys,

insertion,updates,deletions,

collectionCreations,collectionRemovals,collectionUpdates

由此可见,Session不会把所有的持久化对象实体本身缓存,而只是缓存实体或Collection的Identiy值,和状态被更新过的实体或Collection(包括插入,更新,删除)

当Session中缓存的内容过多时会导致OutOfMemory的问题,可以通过两种方式删除缓存的内容:

  • clear(): 清除所有Session缓存;
  • evict(PersistentObject): 将一个特定持久化对象从Session缓存中删除。 

Query Cache:Hibernate可以对频繁进行的查询(相同查询,相同参数)进行缓存以提高效率。但是查询缓存不会缓存结果集中实际的数据实体,而是只缓存Identiy值和结果值类型,因此它应该总是和二级缓存一起使用。但由于实际环境中完全相同的频繁查询很少,所以默认该缓存是disabled的。可以通过两种方式使之生效:(个人觉得这个缓存意义不大)

配置属性:[code=xml]<prop key="hibernate.cache.use_query_cache">true</prop>[/code]

代码:[code=java]Query.setCacheable(true)[/code]

Second-Level Cache:  二级缓存,用于对持久化对象实体或Collection的实际数据进行缓存,用于提供一个集群级别(cluster level),JVM级别,或文件系统级的缓存机制。Hibernate的二级缓存通常都是由第三方的开源项目提供,可以通过配置选择特定的缓存实现,例如:EHCache,OSCache,JBoss Cable等。

配置属性:[code=xml]<prop key="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</prop>[/code]

二级缓存同样可以通过两种方式来管理:

配置属性:[code=xml]<prop key="hibernate.cache.use_second_level_cache">false</prop>[/code]

代码:[code=java]Query.setCacheMode(CacheMode.IGNORE)[/code] (或者GET,NORMAL,PUT,REFRESH)

  • IGNORE: 禁用二级缓存
  • NORMAL: 启用二级缓存,正常读写
  • GET: 只从二级缓存读,除非有数据update
  • PUT: 只向二级缓存写
  • REFRESH: 强制对写入二级缓存的内容进行刷新

最后,在程序调试中,我们可能需要查看各种Cache中实际缓存的内容,可以通过配置属性让Hibernate收集缓存统计信息。当我们遭遇可能由于缓存导致的问题时,这一方法特别有用。

配置属性:[code=xml]<prop key="hibernate.generate_statistics">true</prop>[/code]

在代码中获得统计信息:[code=java]sessionFactory.getStatistics()[/code]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值