概述:
针对查询操作,mybatis支持通过缓存的方式来减少SQL的调用,从而提高查询性能。
同时,缓存又分一级缓存和二级缓存。
一级缓存:粒度较小,基于sqlsession。只对当前sqlsession的相关查询操作进行缓存,不同的sqlsession之间互不影响。
二级缓存:全局缓存,基于namespace,可以由所有的sqlsession共享。即不同的sqlsession查询产生的缓存,对其他sqlsession可见。
一、一级缓存
- mybatis一级缓存支持两种缓存级别,分别是session和statement,默认是session。
- mybatis一级缓存默认开启。
- 一级缓存是内部实现的一个特性,如果想关闭一级缓存,只能配置缓存级别为statement来关闭。
- session级别缓存:对当前sqlsession发起的查询操作进行缓存,即同一sqlsession发起的、多次、相同的查询操作,第一次查询数据库,后续操作查询缓存。(如果另一个sqlsession进行相同的查询操作,仍需查询数据库)
- statement级别缓存:该级别缓存只针对当前执行的查询语句有效,故每次语句执行完之后都会清空缓存。即该sqlsession下次再调用相同的sql语句,由于上一次语句执行后,缓存被清空,故仍需要进行数据库查询。
二、二级缓存
- mybatis二级缓存默认是关闭的。二级缓存支持自定义配置,包括使用本地内存和分布式缓存。
- 二级内存基于namespace,即作用域是mapper。不同的namespace之间互不影响。
- 如果二级缓存使用本地内存,需要再本地内存中缓存大量的数据,可能造成内存资源开销较大。
- 多个sqlSession可以共享一个mapper中的二级缓存区域。
- 开启二级缓存后,会使用cachingexecutor装饰executor,进入一级缓存的查询流程前,现在cachingexecutor进行二级缓存查询。
- 二级缓存优先级高于一级缓存。