Mybatis在没有配置的状况下默认开启一级缓存,一级缓存指相对于同一个sqlsession而言,sqlsession使用map存储对象,map存储了sql查询的结果集,在操做数据库时须要构建sqlsession对象,在对象中有一个数据结构用于存储缓存数据,不一样的sqlsession之间相互不影响。java
一级缓存的生命周期sql
MyBatis在开启一个数据库会话时,会 建立一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。数据库
若是SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。缓存
若是SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,可是该对象仍可以使用。session
SqlSession中执行了任何一个update操做(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,可是该对象能够继续使用数据结构
一级缓存工做原理mybatis
用户经过sql及参数查看缓存中是否有此数据,没有则查询数据库,将查询到的结果存储到sqlsession中对应的一级缓存区域app
若是有update(),insert(),delete()操做,会执行commit操做,清空一级缓存中数据spa
若查询参数和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下的全部缓存数据所有清空。