一级缓存和二级缓存的区别

一级缓存 指的是Session,作用域也是在Session级别 , 在操作数据库时需要构造SQLSession的对象,这个对象中可以存缓存数据,而不同的SQLSession缓存数据的区域是互不影响的,只能作用于在同一个Session中

一级缓存的工作原理:

第一次查询在数据库查,而后放在缓存里,第二次查询就直接在缓存里查

如果两次查询期间有增删改的操作,缓存里的数据会清空,再次查询需要去数据库里查

二级缓存  指的是mapper级别的缓存,实现不同会话中数据的共享,跨SQLSession的,作用范围更大,也就是多个SQLSession去操作同一个mapper的SQL语句

 

二级缓存的工作原理:

在同一个mapper下是可以进行这三种操作,SQLSession1执行了添加,SQLSession2执行了修改,SQLSession3执行了删除

由此可以看出二级缓存中的数据可以让不同的session进行共享这一点有多可怕,二级缓存弊端很严重,从MyBatis默认二级缓存是关闭的就可以看出来。

二级缓存 不适用于映射文件中存在多表查询的情况,如果多个映射文件对应的SQL操作都使用一块缓存,多个Mapper namespace下的所有操作都会对缓存使用造成影响

使用二级缓存时需要想好两个问题:

1)对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据的脏读。

2)对关联表的查询,关联的所有表的操作都必须在同一个namespace。

注:每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。

你可能感兴趣的:(一级缓存与,二级缓存区别,缓存,数据库)