mybatis缓存篇

148 阅读2分钟

概述:

针对查询操作,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进行二级缓存查询。
  • 二级缓存优先级高于一级缓存。