Mybatis缓存

Mybatis一级缓存与二级缓存

(一)一级缓存

Mybatis在没有配置的情况下默认开启一级缓存,一级缓存指相对于同一个sqlsession而言,sqlsession使用map存储对象,map存储了sql查询的结果集,在操作数据库时需要构建sqlsession对象,在对象中有一个数据结构用于存储缓存数据,不同的sqlsession之间相互不影响。

一级缓存的生命周期

  • MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

  • 如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

  • 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

  • SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用

一级缓存工作原理

  • 用户通过sql及参数查看缓存中是否有此数据,没有则查询数据库,将查询到的结果存储到sqlsession中对应的一级缓存区域

  • 如果有update(),insert(),delete()操作,会执行commit操作,清空一级缓存中数据

  • 若查询参数和sql相同的情况下,直接从缓存中读取。

(二)二级缓存

二级缓存是针对每个mapper相同 的namespace进行缓存。每个sqlsession都需调用mapper下的sql语句,在mapper级别设置了二级缓存的数据结构map,每个mapper对应一个map数据结构,map中存储了二级缓存的数据,存储了sql执行查询的结果集(java对象)。
UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。

工作原理
不同的sqlsession都要调用mapper下的sql语句发起数据库请求。

  • sqlsession1执行UserMapper下的查询用户请求先从二级缓存中查找有没有数据,如果没有就从数据库中查询,并且将查询到数据存储二级缓存中。

  • sqlsession2执行UserMapper下的同一个查询用户请求,先从二级缓存中查找有没有数据,如果有就从二级缓存中查询数据,返回。

  • 如果有一个sqlsession3执行UserMapper下添加、修改、删除语句,执行commit操作后,将UserMapper下的所有缓存数据全部清空。

原文地址:https://www.cnblogs.com/gloria-liu/p/10262591.html