网站开发公司怎么建服务器,四川建设部网站,外贸网站建设服务平台,嘉定网站设计制作公司一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期#xff0c;在同一个SqlSession中查询时#xff0c;Mybatis会把执行的方法和参数通过算法生成缓存的键值#xff0c;将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致#xff0c;…一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期在同一个SqlSession中查询时Mybatis会把执行的方法和参数通过算法生成缓存的键值将键值和查询结果存入一个Map对象中。如果同一个SqlSession中执行的方法和参数完全一致那么通过算法会生成相同的键值当Map缓存对象中已经存在改键值时则会返回缓存中的对象。(一个SqlSession连续两次查询 得到的是同一个java对象)任何的insert update delete操作都会清空一级缓存(增删改任何记录都会清空当前SqlSession的缓存)。Spring整合Mybatis的时候一级缓存的问题: 在未开启事物的情况之下每次查询spring都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的 在开启事物的情况之下spring使用threadLocal获取当前资源绑定同一个sqlSession因此此时一级缓存是有效的 Spring结合Mybatis一级缓存失效的问题 二级缓存 Mybatis二级缓存可以理解为存在SqlSessionFactory的生命周期 开启二级缓存: 1.在mybatis-config.xml添加如下代码 settingssetting namecacheEnable valuetrue/setting/settings 2.在对应的XXXMapper.xml的namespace下添加cache/元素 二级缓存特点 SqlSession1调用getMapper获取对象user1 SqlSession1调用getMapper获取对象user2 user1和user2是同一个实例(原理同一级缓存) 如果二级配置可读写的缓存 cache readOnlyfalse/不同SqlSession之间通过序列化和反序列化来保证通过缓存获取数据。 SqlSession2调用getMapper获取对象user1_ SqlSession2调用getMapper获取对象user2_ user1_和user2_就是反序列化得到的结果 是不同的实例 Redis缓存一致性 Mybatis默认提供的缓存是基于Map实现的内存缓存已经可以基本满足应用。但当需要缓存大量数据的时候可以使用Redis缓存数据库来保存Mybatis的二级缓存数据。 但MySQL和Redis是两个事物不好做强一致性。 简单点:可以延时双删过期时间保证最终一致性。 双删的原因是防止并发情况下 update_db的过程中 其他事物发现redis缓存是空 重新赋予了Redis的值 此时如果赋值 是错误的数据 第二次延时删除的原因是要考虑MySQL数据库主从同步的耗时(如果立即删除 有别的线程从MySQL的从库查到的数据放到Redis中 此时的从库可能是没同步的错误数据) rm_redis
update_db
sleep xxx ms
rm_redis转载于:https://www.cnblogs.com/ssskkk/p/11097159.html