一级缓存是session级别,二级缓存是sessionFactory级别即应用级别;
默认是一级缓存,二级缓存需要在实体类加上注解
<span style="font-size:18px;">@Entity(name="user")
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class User {</span>
无论是从一级缓存还是二级缓存获取数据都需要保持session未关闭。
四种查询方式:get、load、iterator、list
1、load优先查询一级缓存,如果没有则创建代理对象,
有的话直接返回实体对象;
返回代理对象需要用的时候再查询二级缓存,
二级缓存没有则查询数据库,
数据库没有的话报No row错误。
2、get优先查询一级缓存,如果没有则查询二级缓存,
二级缓存没有则查询数据库,数据库没有则返回null
3、Iterator每次查询都会先去数据库查询ID,
通过ID再从缓存(先一级缓存,后二级缓存)中查询实体,
缓存中没有的话,再查询数据库(N+1次查询,性能更差)
4、list不会从任何缓存中查询数据,
每次都是直接从数据库查询,但是它会写入缓存。