一级缓存:Springboot+mybatis项目中,当同一个session中有相同的sql执行多次时,mybatis提供了一级缓存来优化这些查询,避免多次查询数据库。一级缓存是session级别的,它的作用范围是当前的session。
例:
一级缓存的作用域有两种 :session和statement,默认为session。可以通过设置local-cache-scope的值来切换,local-cache-scope默认为session。
session:缓存数据会作用于整个sqlSession
statement:缓存数据仅针对一次查询,所以local-cache-scope: statment可以理解为关闭一级缓存
二级缓存:Springboot+mybatis项目中,二级缓存可以在多个sqlSession之间共享,二级缓存是namespace级别的,它的作用域是当前的namespace。mybatis的二级缓存需要在mapper.xml中开启才能生效。
例:
单表的二级缓存开启方式:只需要在mapper.xml中添加cache标签即可。mapper.xml不写cache标签或者cache-enabled:false表示关闭二级缓存。
缓存的优先级: 二级缓存 > 一级缓存 > 数据库
其中任意一个缓存查询到数据后,都会直接返回。
缓存失效:当一个缓存的作用域中发生了insert,update,delete操作时,就会触发缓存失效,下一次查询将直接查询数据库
例:
mybatis默认开启一级缓存,但是一级缓存仅作用于当前sqlSession,无法感知其他sqlSession的境删改操作,极易产生脏数据。而二级缓存可以很好的解决sqlSession之间的数据共享。