mybatis的一级缓存和二级缓存简单理解
一级缓存存在session(SqlSession)中,在查询的是同一条数据时,sql语句只会执行一次。(相同session(SqlSession),查询同一条数据时,执行一条sql语句)。
如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。
当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。
关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。
二级缓存存在于SqlSessionFactory中,如果二级缓存存在,同一个员工只会执行一条sql语句。(不同的session,查询同一条数据时,只会执行一次sql语句)缓存对象必须是序列化对象
在Mapper.xml(想对应的映射文件)中添加一条缓存标签**
在对应的实体类上实现序列化接口
代表创建了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的。
evicition收回策略,默认是LRU
(1)LRU最近最少使用策略,一处做长时间不被使用的对象。
(2)FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
(3)SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
(4)WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象