Hibernate | 一二三级缓存详解
2018-09-17 本文已影响0人
cengel
1.缓存类型:
1.1 事务范围(单Session即一级缓存) 基于线程
事务缓存只能被当前事务缓存,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式。缓存的生命周期依赖于事务的生命周期。事务缓存使用==内存==做存储介质
1.2. 应用缓存(单SessionFactory即二级缓存) ,基于进程的缓存
应用程序的缓存,可以被应用程序内所有事务共享。缓存的生命周期依赖于应用的生命周期。应用级别的缓存可以使用==内存或硬盘==做存储介质。
1.3. 集群范围(多SessionFactory即三级缓存)
在集群环境中,缓存被一个或多个机器的进程共享,缓存数据被复制到集群的每个进程节点下。进程间通过远程通信来保证缓存中的数据一致,缓存数据通常采用对象的松散数据形式
2 缓存机制
2.0 简易示例
//本行是二级缓存,如果二级缓存有数据,则从缓存取,没有则查询数据库
DotaHero dotaHero = hibernateTemplate.execute(session -> (DotaHero) session.createSQLQuery("select * from dota_hero where id = 1 ").addEntity(DotaHero.class).setCacheable(true).setCacheMode(CacheMode.GET).uniqueResult());
//本行不会查询数据库使用一级缓存(session级别的缓存)
dotaHero = dotaHeroService.get(1);
dotaHero = dotaHeroService.get(1); //如上不会查询数据库
===> 控制台打印
Hibernate:
select
dotahero0_.ID as ID1_0_0_, //(说明存在二级缓存)
...
from
DOTA_HERO dotahero0_
where
dotahero0_.ID=?
sql只执行了一次
2.1 一级缓存
2.2 二级缓存
2.1 cacheMode 缓存模式
- CacheMode.NORMAL - 从二级缓存中读、写数据。
- CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
- CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。
- CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。