NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
持久层框架中的重要机制。 一级缓存(本地缓存): 同一个数据库会话期间查询到的数据会放在本地缓存中。 默认情况下只会开启一级缓存(SqlSession级别缓存,也叫本地缓存) 重复调用两次查询,只会发送一次sql,拿到的也是同一个实体类对象。 一级缓存是一直开启的。 一级缓存失效的四种情况: 1.SqlSession不同。 2.SqlSession相同,查询条件不同。 3.SqlSession相同,进行了增删改操作(有可能影响数据)。 4.SqlSession相同,手动清除缓存。 二级缓存(全局缓存):基于namespace级别的缓存:一个namespace对应一个二级缓存: 工作机制 1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中; 2、如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容; 3、sqlSession===Employee==>Employee Department===>Department 不同namespace查出的数据会放在自己对应的缓存中(map) 效果:数据会从二级缓存中获取 查出的数据都会被默认先放在一级缓存中。 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中 使用: 1)、开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/> 2)、去mapper.xml中配置使用二级缓存: <cache></cache> 3)、我们的POJO需要实现序列化接口 二级缓存中的cache配置 <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> eviction:缓存的回收策略: ~~~ • LRU – 最近最少使用的:移除最长时间不被使用的对象。 • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 • 默认的是 LRU。 flushInterval:缓存刷新间隔 缓存多长时间清空一次,默认不清空,设置一个毫秒值 readOnly:是否只读: true:只读;mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。 mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。不安全,速度快 false:非只读:mybatis觉得获取的数据可能会被修改。 mybatis会利用序列化&反序列的技术克隆一份新的数据给你。安全,速度慢 size:缓存存放多少元素; type="":指定自定义缓存的全类名; 实现Cache接口即可; ~~~ 和缓存有关的设置/属性: 1)、cacheEnabled=true: false:关闭缓存(二级缓存关闭)(一级缓存一直可用的) 2)、每个select标签都有useCache="true": false:不使用缓存(一级缓存依然使用,二级缓存不使用) 3)、【每个增删改标签的:flushCache="true":(一级二级都会清除)】 增删改执行完成后就会清楚缓存; 测试:flushCache="true":一级缓存就清空了;二级也会被清除; 查询标签:flushCache="false": 如果flushCache=true;每次查询之后都会清空缓存;缓存是没有被使用的(一级,二级都会清除); 4)、sqlSession.clearCache();只是清楚当前session的一级缓存; 5)、localCacheScope:本地缓存作用域:(一级缓存SESSION);当前会话的所有数据保存在会话缓存中;STATEMENT:可以禁用一级缓存; 对于mybatis而言缓存仅仅是一个Map集合。PerpetualCache 永久缓存类。 memcache,ehcache (hibernate在使用), redis... https://blog.csdn.net/luanlouis/article/details/41390801 强烈推荐大神博客。