一级缓存localCache
在应用运行过程中,可能在一次数据库会话中,执行多条查询条件完全相同的SQL语句。一级缓存就是用于优化这种场景,如果是相同的语句,会优先命中一级缓存,避免对数据库直接进行查询,提高性能。
在每个Sqlsession对象中都持有Executor存放LocalCache。用户发起查询时,Mybatis根据当前执行的语句生成MappedStatemen,在LocalCache中进行查询,如果缓存命中,直接返回结果给用户,如果没有,就查询数据库,将结果写入LocalCache,最后将结果返回给用户。
一级缓存的这个生命周期和sqlsession一致,是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺,最大共享范围是一个sqlsession内部,当有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。
二级缓存
如果多个sqlSession之间需要共享就需要使用二级缓存,开启二级缓存后,会使用CachiingExecutor装饰executor,进入一级缓存的查询流程前,会先在CachingExecutor进行二级缓存的查询