MyBatis 缓存
MyBatis对缓存提供支持,但是在没有配置的情况下,它只开启一级缓存,一级缓存是指相对同一个SqlSession而言,所以在参数和SQL完全相同的情况下,我们使用同一个SqlSession对象 调用一个mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,Mybatis会将其放在缓存中,以后再次查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不是再次发送SQL到数据库。
一级缓存的声明周期?
1、MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象,当会话结束时,SqlSession对象以及内部的Executor对象还有PerpetualCache对象也会一起释放掉。
2、如果SqlSession调用了Close()方法,也会清空PerpetualCache对象中的数据,但是该对象仍可以用。
3、SqlSession中执行任何一个update操作(update、delete、insert)都会清空PerpetualCache对象的数据,但是该对象仍可以用。
二级缓存
MyBatis的二级缓存是Application级别的缓存,他可以提高对数据库的查询效率,以及提高应用的性能。
SqlSessionFactory 层面上的二级缓存,默认是不开启的,二级缓存必须需要配置,实现二级缓存的时候,MyBatis 要求返回的实体 必须是“序列化”的。(实体类 extends Serializable)
1、映射语句文件中的所有的select语句都会被缓存
2、映射语句文件中的所有 insert update delete语句都会刷新缓存
3、缓存会使用默认的Least Recently Used( LRU ,最近很少使用 ) 算法来收回。
4、根据时间表(CNFI 没有刷新间隔)缓存不会 以任何时间顺序来刷新
5、缓存会存储列表集合或对象(无论查询方法返回什么)的1024引用
6、缓存会被视为Read/Write(可读、可写)的缓存,所以这意味对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他的调用者或线程。