mybatis 一级缓存和二级缓存

一级缓存也叫sqlsession缓存,默认是一直开启的,无法关闭

1、不同sqlsession的缓存是不能共用的

2、相同sqlsession中,两次查询之间如果有增删改动作,缓存也会失效,会重新查询数据库

 

 

二级缓存也叫全局缓存,namespace缓存,默认是关闭的,而且pojo类需要实现序列化接口

工作机制:

当一个sqlsession查询出数据,在关闭sqlsession后,会把缓存放入到二级缓存中,在sqlsession关闭之前,全局缓存是没有这个缓存的

1、在mapper.xml中配置cache信息,在xml中配置了cache信息才会缓存这个namespace

2、只有sqlsession关闭后,缓存才会放入二级缓存中

为什么不推荐使用二级缓存?

二级缓存是以namespace为单位的,不同namespace下的操作互不影响。

多表操作会有缓存问题

解疑:

针对一个表的某些操作不在他独立的namespace下进行。

例如在UserMapper.xml中有大多数针对user表的操作。但是在一个XXXMapper.xml中,还有针对user单表的操作。

这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确。

更危险的情况是在XXXMapper.xml做了insert,update,delete操作时,会导致UserMapper.xml中的各种操作充满未知和风险。

你可能感兴趣的:(Java框架)