1. Hibernate缓存简介和对比、一级缓存、二级缓存详解
  1. hibernate缓存机制

1.缓存类型:

1.1 事务范围(单Session即一级缓存) 基于线程

事务缓存只能被当前事务缓存,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式。缓存的生命周期依赖于事务的生命周期。事务缓存使用内存做存储介质

1.2. 应用缓存(单SessionFactory即二级缓存) ,基于进程的缓存

应用程序的缓存,可以被应用程序内所有事务共享。缓存的生命周期依赖于应用的生命周期。应用级别的缓存可以使用内存或硬盘做存储介质。

1.3. 集群范围(多SessionFactory即三级缓存)

在集群环境中,缓存被一个或多个机器的进程共享,缓存数据被复制到集群的每个进程节点下。进程间通过远程通信来保证缓存中的数据一致,缓存数据通常采用对象的松散数据形式

2 缓存机制

2.1 一级缓存

hibernate(二)一级缓存和三种状态解析

一级缓存的简单示例

  1. //本行是二级缓存,如果二级缓存有数据,则从缓存取,没有则查询数据库
  2. DotaHero dotaHero = hibernateTemplate.execute(session -> (DotaHero) session.createSQLQuery("select * from dota_hero where id = 1 ").addEntity(DotaHero.class).setCacheable(true).setCacheMode(CacheMode.GET).uniqueResult());
  3. //本行不会查询数据库使用一级缓存(session级别的缓存)
  4. dotaHero = dotaHeroService.get(1);
  5. dotaHero = dotaHeroService.get(1); //如上不会查询数据库
  6. ===> 控制台打印
  7. Hibernate:
  8. select
  9. dotahero0_.ID as ID1_0_0_, //(说明存在二级缓存)
  10. ...
  11. from
  12. DOTA_HERO dotahero0_
  13. where
  14. dotahero0_.ID=?
  15. sql只执行了一次

2.2 二级缓存

hibernate(九) 二级缓存和事务级别详讲

2.2.1 缓存模式 (cacheMode )

  • CacheMode.NORMAL - 从二级缓存中读、写数据。
  • CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
  • CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。
  • CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。