定义
一级缓存中SqlSession中的缓存,关闭后,将不可用
当创建一个新的SqlSession后,就会创建一个新的Executor,来负责对数据库的各种操作和维护缓存。
BaseExecutor中持有一个Cache接口的实现类PerpetualCache
Cache接口
Mybatis定义的一个接口作为其实现类的SPI(Service Provider Infterface)
所有的Cache的实现类都应实现该接口。如:PerpetualCache类
CacheKey类
由statementId + rowBound + 传递给JDBC Statement的SQL + 传递给JDBC Statement的SQL的参数组成
PerpetualCache一级缓存实现
内部通过一个HashMap<K, V>来实现的,没有任何容量和大小的限制
一级缓存生命周期
sqlSession会话结束后,其几个内部的Executor、PerpetualCache都会被释放掉。
sqlSession.close()
sqlSession.clearCache(),清空缓存
sqlSession期间执行了update操作(增,删,改)都会清空缓存。
工作流程
- 根据statementId, params, rowBounds来创建一个key值(为CacheKey实例),根据key获取缓存。
- 命中则返回,否则查数据库,然后再放入缓存。
怎么判断两次查询是否相同
以下条件都相同则认为是相同查询
- StatementId
- 获取结果集的范围,即分页数据,由rowBound.offset和rowBound.limit指定。
- 传给JDBC PreparedStatement的sql, 由boundSql.getSql()获取
- 传给JDBC PreparedStatement的sql中?占位符参数一致。