公司动态

MyBatis的一级缓存和二级缓存是怎么样的?

📅 2026/7/14 13:28:51
MyBatis的一级缓存和二级缓存是怎么样的?
目录1. 一级缓存2. 一级缓存失效的几种情况3. 二级缓存4.二级缓存失效的情况5. 二级缓存的相关配置6. 缓存的查询顺序MyBatis 的缓存共分为一级缓存和二级缓存。1. 一级缓存一级缓存是 SqlSession 级别的通过同一个 SqlSession 查询到的数据会被缓存下次查询相同的数据时会直接从缓存中查询不会从数据库重复访问。2. 一级缓存失效的几种情况1不同的 SqlSession 对应不同的缓存2同一个 SqlSession 查询条件不同3同一个 SqlSession 两次查询期间执行了任何一次增删改操作4同一个 SqlSession 两次查询期间手动清空了缓存3. 二级缓存二级缓存是 SqlSessionFactory 级别的通过同一个 SqlSessionFactory 创建的 SqlSession 查询的结果会被缓存起来此后若再执行相同的查询语句结果就会从缓存中获取。一个工厂可以创建多个 SqlSession因此它所创建的 SqlSession 查询到的数据都被会缓存到二级缓存中。二级缓存是需要手动开启的需要以下几个条件1在核心配置文件中设置全局属性 cacheEnabled true默认为 true其实也不需要设置2在映射文件中设置标签cache/3二级缓存必须要SqlSession 关闭或提交之后有效4查询的数据所转换的实体类类型必须实现序列化的接口4.二级缓存失效的情况二级缓存失效的情况只有一种就是当两次查询执行了任意增删改在操作之后会是一级缓存和二级缓存同时失效。5. 二级缓存的相关配置刚才我提到了想要开启二级缓存需要在 mapper.xml 的映射文件中配置上 cache/ 这么一个标签除此之外我们还可以为此标签配置多个属性常用的属性有以下几种。enviction属性缓存回收策略LRU(Least Recently Used)最近最少使用的移除最长时间不被使用的对象FIFO(First in First out)先进先出按对象进入缓存的顺序来移除它们SOFT软引用移除基于垃圾回收器状态和软引用使用规则的对象WEAK弱引用更积极地基于垃圾回收器状态和弱引用规则的对象默认是LRU。flushInterval属性刷新间隔单位毫秒默认情况是不设置也就是没有刷新间隔缓存仅仅调用语句时刷新。size属性引用数目正整数。代表缓存最多可以存储多少个对象太大容易导致内存溢出。readOnly属性只读ture或falseture只读缓存会给所有调用者返回缓存对象的相同实例。因为这些对象不能被修改者提供了很重要的性能优势。false读写缓存会返回缓存对象的拷贝(通过序列化)这会慢一些但是安全。默认也就是false。6. 缓存的查询顺序先查询二级缓存因为二级缓存中可能会有其他程序已经查出来的数据可以拿来直接使用。如果二级缓存没有命中再去查询一级缓存。如果一级缓存也没有命中则查询数据库。SqlSession 关闭之后一级缓存中的数据会写入到二级缓存中。