Mybatis的一级缓存和一级缓存

Mybatis的一级缓存

一级缓存是SqlSession级别,默认开启并且不能关闭。

 操作数据库时需要创建SqlSession对象,对象中有一个HashMap存储缓存数据,不同的SqlSession之间缓存的数据区域互不影响。每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。

也就是说,一级缓存的作用域是SqlSession范围的,在同一个SqlSession中执行两次相同的SQL语句时,第一次执行完毕的结果会保存在缓存中,第二次进行相同查询时,直接从缓存中获取。

如果SqlSession执行了DML操作(insert,update,delete),这个SqlSession对应的一级缓存将会失效,来保证数据的有效性。

因此,存在多个SqlSession或者在分布式的环境下,DML操作都只会使得对应的一级缓存失效,这就可能产生脏数据的问题。

Mybatis的二级缓存

Mybatis的二级缓存是默认关闭的。

使用二级缓存时,多个SqlSession使用同一个Mapper的SQL语句操作数据库,得到的数据会存在二级缓存区,同样使用HashMap进行数据存储,相比一级缓存,二级缓存的范围更大,多个SqlSession可以共用二级缓存,作用域是Mapper的同一个namespace,不同的SqlSession两次执行相同的namespace下的SQL语句,参数相等的情况下,第一次执行的结果保存在二级缓存中,第二次执行将会直接从二级缓存中取数据。

由于Mybatis的二级缓存是基于namespace的,多表查询语句所在的namespace无法感知到其他namespace对对多表查询中涉及的表进行的修改,从而也容易产生脏数据问题。

猜你喜欢

转载自blog.csdn.net/bai_ye_/article/details/107536574