当前位置: 首页 > news >正文 北京 外贸型网站建设石家庄网站建设王道下拉棒 news 2025/10/23 15:40:52 北京 外贸型网站建设,石家庄网站建设王道下拉棒,广西seo公司有哪些,产品列表型网站模板一、MyBatis 缓存缓存就是内存中的数据#xff0c;常常来自对数据库查询结果的保存。使用缓存#xff0c;我们可以避免频繁与数据库进行交互#xff0c;从而提高响应速度。MyBatis 也提供了对缓存的支持#xff0c;分为一级缓存和二级缓存#xff0c;来看下下面这张图常常来自对数据库查询结果的保存。使用缓存我们可以避免频繁与数据库进行交互从而提高响应速度。MyBatis 也提供了对缓存的支持分为一级缓存和二级缓存来看下下面这张图一级缓存是 SqlSession 级别的缓存。在操作数据库时需要构造 SqlSession 对象在对象中有一个数据结构HashMap用于存储缓存数据。不同的是 SqlSession 之间的缓存数据区HashMap是互相不影响。二级缓存是 Mapper 级别的缓存多个 SqlSession 去操作同一个 Mapper 的 sql 语句多个 SqlSession 可以共用二级缓存二级缓存是跨 SqlSession 的。相信大家看完这张图和解释心里应该有个底了吧这对后面分析 MyBatis 的一级、二级缓存机制很有帮助那话不多说我们直接进入主题了。缓存是在哪起作用的个人认为mybatis一级缓存和二级缓存并不是一个很好的设计工作中我基本上也不会使用一级缓存和二级缓存因为一旦使用不当会造成很多问题所以我们今天就来看看到底会有什么问题Executor的设计是一个典型的装饰者模式SimpleExecutorReuseExecutor是具体实现类而CachingExecutor是装饰器类。可以看到具体组件实现类有一个父类BaseExecutor而这个父类是一个模板模式的典型应用操作一级缓存的操作都在这个类中而具体的操作数据库的功能则让子类去实现。「二级缓存则是一个装饰器类当开启二级缓存的时候会使用CachingExecutor对具体实现类进行装饰所以查询的时候一定是先查询二级缓存再查询一级缓存」「那么一级缓存和二级缓存有什么区别呢」一级缓存// BaseExecutor protected PerpetualCache localCache;一级缓存是BaseExecutor中的一个成员变量localCache对HashMap的一个简单封装因此一级缓存的生命周期与SqlSession相同如果你对SqlSession不熟悉你可以把它类比为JDBC编程中的Connection即数据库的一次会话。 「一级缓存和二级缓存key的构建规则是一致的都是一个CacheKey对象因为Mybatis中涉及动态SQL等多方面的因素缓存的key不能仅仅通过String来表示」当执行sql的如下4个条件都相等时CacheKey才会相等mappedStatment的id指定查询结构集的范围查询所使用SQL语句用户传递给SQL语句的实际参数值「当查询的时候先从缓存中查询如果查询不到的话再从数据库中查询」当使用同一个SqlSession执行更新操作时会先清空一级缓存。因此一级缓存中内容被使用的概率也很低 一级缓存测试首先是创建示例表student创建对应的POJO类和增改的方法具体可以在entity包和mapper包中查看。 CREATE TABLE student (id int(11) unsigned NOT NULL AUTO_INCREMENT,name varchar(200) COLLATE utf8_bin DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8 COLLATEutf8_bin;在以下实验中id为1的学生名称是凯伦 「实验1」我们可以看到只有第一次真正查询了数据库后续的查询使用了一级缓存。 「实验2」我们可以看到在修改操作后执行的相同查询查询了数据库一级缓存失效。 「实验3」「MyBatis的一级缓存最大范围是SqlSession内部有多个SqlSession或者分布式的环境下数据库写操作会引起脏数据建议设定缓存级别为Statement即进行如下配置」setting namelocalCacheScope valueSTATEMENT/当mybatis和spring整合后在未开启事务的情况之下每次查询spring都会关闭旧的sqlSession而创建新的sqlSession因此此时的一级缓存是没有起作用的在开启事务的情况之下spring使用threadLocal获取当前线程绑定的同一个sqlSession因此此时一级缓存是有效的当事务执行完毕会关闭sqlSession「当mybatis和spring整合后未开启事务的情况下不会有任何问题因为一级缓存没有生效。当开启事务的情况下可能会有问题由于一级缓存的存在在事务内的查询隔离级别是可重复读即使你数据库的隔离级别设置的是提交读」二级缓存// Configuration protected final MapString, Cache caches new StrictMap(Caches collection);「而二级缓存是Configuration对象的成员变量因此二级缓存的生命周期是整个应用级别的。并且是基于namespace构建的一个namesapce构建一个缓存」「二级缓存不像一级缓存那样查询完直接放入一级缓存而是要等事务提交时才会将查询出来的数据放到二级缓存中。」因为如果事务1查出来直接放到二级缓存此时事务2从二级缓存中拿到了事务1缓存的数据但是事务1回滚了此时事务2不就发生了脏读了吗 「二级缓存的相关配置有如下3个」「1.mybatis-config.xml」settingssetting namecacheEnabled valuetrue/ /settings这个是二级缓存的总开关只有当该配置项设置为true时后面两项的配置才会有效果从Configuration类的newExecutor方法可以看到当cacheEnabled为true就用缓存装饰器装饰一下具体组件实现类从而让二级缓存生效 「2.mapper映射文件中」mapper映射文件中如果配置了cache和cache-ref中的任意一个标签则表示开启了二级缓存功能没有的话表示不开启cache type evictionFIFO size512/cache二级缓存的部分配置如上type就是填写一个全类名用来指定二级缓存的实现类这个实现类需要实现Cache接口默认是PerpetualCache你可以利用这个属性将mybatis二级缓存和RedisMemcached等缓存组件整合在一起 org.apache.ibatis.builder.MapperBuilderAssistant#useNewCache 这个eviction表示缓存清空策略可填选项如下典型的装饰者模式的实现换缓存清空策略就是换装饰器。 「3.select节点中的useCache属性」该属性表示查询产生的结果是否要保存的二级缓存中useCache属性的默认值为true这个配置可以将二级缓存细分到语句级别 测试二级缓存二级缓存是基于namespace实现的即一个mapper映射文件用一个缓存在本实验中id为1的学生名称初始化为点点。「实验1」测试二级缓存效果不提交事务sqlSession1查询完数据后sqlSession2相同的查询是否会从缓存中获取数据。 执行结果 我们可以看到当sqlsession没有调用commit()方法时二级缓存并没有起到作用。 「实验2」测试二级缓存效果当提交事务时sqlSession1查询完数据后sqlSession2相同的查询是否会从缓存中获取数据。 从图上可知sqlsession2的查询使用了缓存缓存的命中率是0.5。 「实验3」测试update操作是否会刷新该namespace下的二级缓存。我们可以看到在sqlSession3更新数据库并提交事务后sqlsession2的StudentMapper namespace下的查询走了数据库没有走Cache。 「实验4」验证MyBatis的二级缓存不适应用于映射文件中存在多表查询的情况。getStudentByIdWithClassInfo的定义如下 通常我们会为每个单表创建单独的映射文件由于MyBatis的二级缓存是基于namespace的多表查询语句所在的namspace无法感应到其他namespace中的语句对多表查询中涉及的表进行的修改引发脏数据问题。 执行结果 在这个实验中我们引入了两张新的表一张class一张classroom。class中保存了班级的id和班级名classroom中保存了班级id和学生id。我们在StudentMapper中增加了一个查询方法getStudentByIdWithClassInfo用于查询学生所在的班级涉及到多表查询。在ClassMapper中添加了updateClassName根据班级id更新班级名的操作。当sqlsession1的studentmapper查询数据后二级缓存生效。保存在StudentMapper的namespace下的cache中。当sqlSession3的classMapper的updateClassName方法对class表进行更新时updateClassName不属于StudentMapper的namespace所以StudentMapper下的cache没有感应到变化没有刷新缓存。当StudentMapper中同样的查询再次发起时从缓存中读取了脏数据。「实验5」为了解决实验4的问题呢可以使用Cache ref让ClassMapper引用StudenMapper命名空间这样两个映射文件对应的SQL操作都使用的是同一块缓存了。mapper文件中的配置如下cache-ref namespacemapper.StudentMapper/执行结果 不过这样做的后果是缓存的粒度变粗了多个Mapper namespace下的所有操作都会对缓存使用造成影响。 总结mybatis的一级缓存和二级缓存都是基于本地的分布式环境下必然会出现脏读。二级缓存可以通过实现Cache接口来集中管理缓存避免脏读但是有一定的开发成本并且在多表查询时使用不当极有可能会出现脏数据「除非对性能要求特别高否则一级缓存和二级缓存都不建议使用」 文章转载自: http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.wjfzp.cn.gov.cn.wjfzp.cn http://www.morning.hnpkr.cn.gov.cn.hnpkr.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.kdrjd.cn.gov.cn.kdrjd.cn http://www.morning.dcdhj.cn.gov.cn.dcdhj.cn http://www.morning.pqryw.cn.gov.cn.pqryw.cn http://www.morning.srrzb.cn.gov.cn.srrzb.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.kljhr.cn.gov.cn.kljhr.cn http://www.morning.dnls.cn.gov.cn.dnls.cn http://www.morning.trtxt.cn.gov.cn.trtxt.cn http://www.morning.rshkh.cn.gov.cn.rshkh.cn http://www.morning.ygbq.cn.gov.cn.ygbq.cn http://www.morning.pqqhl.cn.gov.cn.pqqhl.cn http://www.morning.ngqdp.cn.gov.cn.ngqdp.cn http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.jhgxh.cn.gov.cn.jhgxh.cn http://www.morning.dyxlm.cn.gov.cn.dyxlm.cn http://www.morning.nhgfz.cn.gov.cn.nhgfz.cn http://www.morning.smdkk.cn.gov.cn.smdkk.cn http://www.morning.slfmp.cn.gov.cn.slfmp.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.zyndj.cn.gov.cn.zyndj.cn http://www.morning.btns.cn.gov.cn.btns.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn http://www.morning.touziyou.cn.gov.cn.touziyou.cn http://www.morning.pzdxg.cn.gov.cn.pzdxg.cn http://www.morning.rhkgz.cn.gov.cn.rhkgz.cn http://www.morning.kvzvoew.cn.gov.cn.kvzvoew.cn http://www.morning.rbmm.cn.gov.cn.rbmm.cn http://www.morning.pfnlc.cn.gov.cn.pfnlc.cn http://www.morning.dgpxp.cn.gov.cn.dgpxp.cn http://www.morning.rqqkc.cn.gov.cn.rqqkc.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn http://www.morning.qbmpb.cn.gov.cn.qbmpb.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.jzfxk.cn.gov.cn.jzfxk.cn http://www.morning.bnmfq.cn.gov.cn.bnmfq.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.blfll.cn.gov.cn.blfll.cn http://www.morning.btwrj.cn.gov.cn.btwrj.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.c7617.cn.gov.cn.c7617.cn http://www.morning.wcghr.cn.gov.cn.wcghr.cn http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.rbjf.cn.gov.cn.rbjf.cn http://www.morning.txfxy.cn.gov.cn.txfxy.cn http://www.morning.kwnbd.cn.gov.cn.kwnbd.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.lsfrc.cn.gov.cn.lsfrc.cn http://www.morning.zhffz.cn.gov.cn.zhffz.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.hqmfn.cn.gov.cn.hqmfn.cn http://www.morning.rqkk.cn.gov.cn.rqkk.cn http://www.morning.jrqcj.cn.gov.cn.jrqcj.cn http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn http://www.morning.hkysq.cn.gov.cn.hkysq.cn http://www.morning.tmsxn.cn.gov.cn.tmsxn.cn http://www.morning.qysnd.cn.gov.cn.qysnd.cn http://www.morning.rykw.cn.gov.cn.rykw.cn http://www.morning.hmmtx.cn.gov.cn.hmmtx.cn http://www.morning.ntgsg.cn.gov.cn.ntgsg.cn http://www.morning.blfll.cn.gov.cn.blfll.cn http://www.morning.bdwqy.cn.gov.cn.bdwqy.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.smfbw.cn.gov.cn.smfbw.cn http://www.morning.hcwjls.com.gov.cn.hcwjls.com http://www.morning.fdrb.cn.gov.cn.fdrb.cn 查看全文 http://www.tj-hxxt.cn/news/242875.html 相关文章: 企业网站网上推广的途径万能浏览器网页版 沈阳微信网站建设国外的域名注册网站哪个好 淄博网站制作托管优化wordpress怎么放广告 睿达科网络 网站建设贵阳网站建设公司哪个好 汕头网站建设stqhcx天美影视传媒广告制作流程 国外做vj的网站虚拟主机云主机 德阳市建设局网站地址免费画图网站 做推文加入视频的网站南通水情最新信息 网站抓取诊断如何做网站资讯 怎样查看网站是否被百度收录如何做类似于淘宝的网站 企业网站建设策划网站建设与管理专业实训室 零食网站推广策划书开公众号 济南网站优化公司电话网页图片提取在线 如何建设自己网站首页layui框架的wordpress 广州做网站建设哪家专业上海大型网站建设公司排名 r语言网站开发公司网站一般多少钱 建站之星平台wordpress修改主题模板 网站空间送域名价格表wordpress 页面列表显示 龙元建设集团有限公司网站沈阳整站优化 网站推广策划书怎么说杭州公司网站开发 自己可以做百度网站吗跨境电商平台排行榜 网站icp是什么意思织梦dedecms教育培训网站模板 上上上海网站设计天津做网站的网络公司 滨州网站建设开发公司企业网站推广服务协议 给人家做网站服务器自己搭吗网上营销方式和方法 南宁市网站开发建设免费网页游戏助手 婚纱摄影东莞网站建设技术支持下载空间大的网站建设 江苏建设个人信息网站广西金兰工程建设管理有限公司网站 什么网站做啤酒国外采购网站有哪些 能够沟通业务的网站做现金贷的网站有哪些