作用域和生命周期
- 执行流程
- sqlSessionFactoryBuilder
一旦创建了 sqlSessionFactoryBuilder,就不再需要了。
局部变量。 - sqlSessionFactory
想象为数据库连接池,一旦创建就一直存在。
应用作用域(全局作用域)。
使用单例模式或者静态单例模式。 - sqlSession
连接到连接池的一个请求。
sqlSession 的实例不是线程安全的,最佳作用域是请求或方法作用域。
用完之后关闭。
执行流程
缓存
简介
- 什么是缓存
- 存在内存中的临时数据
- 将用户经常查询的数据放在缓存中,用户查询数据时不用从数据库中查询,从缓存中查询,提高查询效率,解决了高并发系统的性能问题。
- 为什么使用缓存
- 减少和数据库的交互次数,减少系统开销,提高系统效率。
- 什么样的数据能使用缓存
MyBatis 缓存
- MyBatis 系统中默认定义了两级缓存,一级缓存和二级缓存。
- 默认情况下开启一级缓存,sqlSession 级别的缓存。
- 二级缓存需要手动开启和配置,是基于 namespace 级别的缓存。
- MyBatis 定义了缓存接口 Cache。可以通过实现 Cache 接口自定义二级缓存。
一级缓存
- 与数据库同一次会话期间查询到的数据会放在本地缓存中。
- 如需要获取相同的数据,直接从缓存中拿。
- 失效情况:
- 查询不同的数据。
- 增删改操作,改变原来数据。
- 手动清理缓存。
二级缓存
- 在 MyBatis 的配置文件中显式开启二级缓存。
<setting name="cacheEnabled" value="true"/>
- 在 mapper.xml 中加入
<cache/>
开启二级缓存。 - 将实体类序列化 implements Serializable
- 基于 namespace 级别的缓存,一个命名空间对应一个二级缓存。
- 工作机制
- 每个会话查询数据,被查询的数据放在当前会话的一级缓存中。
- 当前会话关闭,一级缓存消失,数据保存到二级缓存中。
- 新的会话查询数据,从二级缓存中获取。
- 不同的 mapper 查出的数据放在自己对应的缓存中。
缓存原理
- 先查看二级缓存中是否存在数据。
- 若二级缓存中没有,查看一级缓存。
- 若一级缓存中没有,查询数据库。