hibernate缓存
hibernate提供了两个级别的缓存
-
一级缓存 session级别的缓存,属于事务范围的缓存,由hibernate来管理 -
二级缓存 sessionFactory级别的缓存,属于进程范围内的缓存
一级缓存
一级缓存是session级别的缓存,且是一种强制使用的缓存,不可以关闭,保证一个session中两次请求同一个对象时,取得的对象是同一个Java实例
二级缓存
二级缓存是属于sessionFactory的外置缓存,默认情况下hibernate是不会启用的,需要第三方的插件
hibernate允许使用的缓存插件
-
EHCache 可作为进程范围内的缓存,支持hibernate查询缓存 -
OpenSysphony OSCache 可作为进程范围内的缓存,支持hibernate查询缓存 -
SwarmCache 可作为集群范围内的缓存,不支持hibernate的查询缓存 -
JBossCache 可作为集群范围内的缓存,支持hibernate的查询缓存
二级缓存的使用
在hibernate.cfg.xml中配置启用二级缓存
<!-- 启用二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 二级缓存指定第三方插件 -->
<property name="hibernate.cache.provider_class"></property>
<!-- 配置哪个类使用二级缓存 -->
<class-cache class="com.zhanghe.study.model.User" usage="read-write"/>
usage为并发策略
-
transactional 为主读数据使用这个策略,在一次更新的罕见状况下并发事务阻止过期数据是关键的 -
read-write 为主读数据再一次使用这个策略,在一次更新的罕见状况下并发事务阻止过期数据是关键的 -
nonstrict-read-write 这个策略不保证缓存和数据库之间的一致性。如果数据几乎不改变并且过期数据不是很重要,使用这个策略 -
read-only 一个适合永不改变数据的并发策略。只为参考数据使用它
哪个类使用二级缓存的配置也可以在.hbm.xml中配置
<cache usage="read-write"/>
如果有关联关系的话,还需要再进行设置集合的二级缓存
<!-- collection表示的是全类名加上集合属性名 这时候只会缓存OID-->
<collection-cache collection="com.zhanghe.study.model.many2one.Customer.orderList" usage="read-write"/>
<!-- 在缓存该集合类的实际类型 -->
<class-cache class="com.zhanghe.study.model.many2one.Order" usage="read-write"/>
上述配置对于查询缓存不生效,需要再加上以下配置,并且在查询时使用query.setCacheable(true),查询缓存依赖于二级缓存
<!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property>
https://zhhll.icu/2020/框架/hibernate/基础/12.hibernate缓存/
本文由 mdnice 多平台发布