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