mybaits缓存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MakeContral/article/details/79614198

一级缓存

每一个SqlSession中持有了自己的Executor,每一个Executor中有一个Local Cache。在同一个sqlsession中,如果执行的语句是一样的,那么只有在第一次的时候才会去查询数据库,后面都是将Local Cache的数据返回。

在同一个sqlsession中还有一个问题是,但执行更新,插入,删除等操作,对应的Local Cache会被更新掉。

如sqlsession.查询(“Select * from user where id=1”);查询一次数据库,把结果更新在local cache中。sqlsession.更新(“update user set name=a where id=1”);将缓存清空。
sqlsession.查询(“Select * from user where id=1”)再一次查询数据库,把结果更新在local cache中。

如果是在不同的sqlsession中执行的话,会有一个问题

sqlsession1.查询(“Select * from user where id=1”);查询一次数据库,把结果更新在local cache中
sqlsession2.更新(“update user set name=a where id=1”);

当sqlsession1再次执行的时候,因为sqlsession1中的local cache没有被清空,还缓存着第一次执行的语句,所以当sqlsession1.查询(“Select * from user where id=1”);的时候会是脏数据。

二级缓存

一级缓存针对的是一个sqlsession的内部,而二级缓存针对一个namespace。

比如现在有两张表student表 ,class表

id ,stu_name,classid。
1 , 小白, 1
2 , 小红, 2

id,class_name
1,终极一班
2,终极二班

那么针对student,class表操作的,都会放在对应的namespace上。

StudentMapper studentMapper = sqlSession1.getMapper(StudentMapper.class);
StudentMapper studentMapper2 = sqlSession2.getMapper(StudentMapper.class); 
ClassMapper classMapper = sqlSession3.getMapper(ClassMapper.class);
//第一次查询过数据库,然后把对应的结果和语句缓存在对应的namespace中。
现在studentMapper.查询("Select * from student where id=1");

//二级缓存在SqlSession关闭或提交之后才会生效。
//看源码可以知道commit方法会把数据丢到cache中,也就是丢到二级缓存中!
sqlSession1.commit();

//虽然是不同的sqlsession,但是也是在同一个namespace下面,所以是可以用到缓存的
studentMapper2.查询("Select * from student where id=1");

//如果在查询的时候牵扯到多表查询

//表示查询的是用户id为1,classid为1的数据,
studentMapper.查询姓名和班级名称(1,1)
//输出了 小白,终极一班。但是这个查询的结果缓存只会放在ClassMapper对应的namespace下面。

//把class中的id为1的数据改成了1,一班。
//这个时候的更新操作只会针对classMapper对应的namespace下的缓存。
//并不会刷新classMapper对应的namespace
classMapper.update(1,"一班")

//这个时候我如果再次执行,就拿到脏数据
studentMapper.查询姓名和班级名称(1,1)
//应该输出 小白,一班。但是因为缓存存在的原因,会把缓存中的结果输出,小白,终极一班

为了解决问题呢,可以使用Cache ref,让ClassMapper引用StudenMapper命名空间,这样两个映射文件对应的Sql操作都使用的是同一块缓存了。

不过这样做的后果是,缓存的粒度变粗了,多个Mapper namespace下的所有操作都会对缓存使用造成影响,其实这个缓存存在的意义已经不大了。

猜你喜欢

转载自blog.csdn.net/MakeContral/article/details/79614198