当前位置: 首页 > news >正文

广西壮族自治区网站建设_网站建设公司_页面加载速度_seo优化

汽车销售网站模板 cms,可视化网页设计,建设施工合同网站,富阳区住房和城乡建设局网站2019独角兽企业重金招聘Python工程师标准 Mybatis 为我们提供了一级缓存和二级缓存#xff0c;可以通过下图来理解#xff1a; ①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象#xff0c;在对象中有一个数据结构#xff08;Hash… 2019独角兽企业重金招聘Python工程师标准 Mybatis 为我们提供了一级缓存和二级缓存可以通过下图来理解 ①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象在对象中有一个数据结构HashMap用于存储缓存数据。不同的sqlSession之间的缓存数据区域HashMap是互相不影响的。 ②、二级缓存是mapper级别的缓存多个SqlSession去操作同一个Mapper的sql语句多个SqlSession可以共用二级缓存二级缓存是跨SqlSession的。 1、一级缓存 ①、我们在一个 sqlSession 中对 User 表根据id进行两次查询查看他们发出sql语句的情况。 Test public void testSelectOrderAndUserByOrderId(){//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession sessionFactory.openSession();String statement one.to.one.mapper.OrdersMapper.selectOrderAndUserByOrderID;UserMapper userMapper sqlSession.getMapper(UserMapper.class);//第一次查询发出sql语句并将查询的结果放入缓存中User u1 userMapper.selectUserByUserId(1);System.out.println(u1);//第二次查询由于是同一个sqlSession,会在缓存中查找查询结果//如果有则直接从缓存中取出来不和数据库进行交互User u2 userMapper.selectUserByUserId(1);System.out.println(u2);sqlSession.close(); } 查看控制台打印情况 ②、 同样是对user表进行两次查询只不过两次查询之间进行了一次update操作。 Test public void testSelectOrderAndUserByOrderId(){//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession sessionFactory.openSession();String statement one.to.one.mapper.OrdersMapper.selectOrderAndUserByOrderID;UserMapper userMapper sqlSession.getMapper(UserMapper.class);//第一次查询发出sql语句并将查询的结果放入缓存中User u1 userMapper.selectUserByUserId(1);System.out.println(u1);//第二步进行了一次更新操作sqlSession.commit()u1.setSex(女);userMapper.updateUserByUserId(u1);sqlSession.commit();//第二次查询由于是同一个sqlSession.commit(),会清空缓存信息//则此次查询也会发出 sql 语句User u2 userMapper.selectUserByUserId(1);System.out.println(u2);sqlSession.close(); } 控制台打印情况 ③、总结 1、第一次发起查询用户id为1的用户信息先去找缓存中是否有id为1的用户信息如果没有从数据库查询用户信息。得到用户信息将用户信息存储到一级缓存中。 2、如果中间sqlSession去执行commit操作执行插入、更新、删除则会清空SqlSession中的一级缓存这样做的目的为了让缓存中存储的是最新的信息避免脏读。 3、第二次发起查询用户id为1的用户信息先去找缓存中是否有id为1的用户信息缓存中有直接从缓存中获取用户信息。 2、二级缓存 二级缓存的原理和一级缓存原理一样第一次查询会将数据放入缓存中然后第二次查询则会直接去缓存中取。但是一级缓存是基于 sqlSession 的而 二级缓存是基于 mapper文件的namespace的也就是说多个sqlSession可以共享一个mapper中的二级缓存区域并且如果两个mapper的namespace相同即使是两个mapper那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中。 那么二级缓存是如何使用的呢 ①、开启二级缓存 和一级缓存默认开启不一样二级缓存需要我们手动开启 首先在全局配置文件 mybatis-configuration.xml 文件中加入如下代码 !--开启二级缓存 -- settingssetting namecacheEnabled valuetrue/ /settings 其次在 UserMapper.xml 文件中开启缓存 !-- 开启二级缓存 -- cache/cache 我们可以看到 mapper.xml 文件中就这么一个空标签cache/其实这里可以配置cache typeorg.apache.ibatis.cache.impl.PerpetualCache/,PerpetualCache这个类是mybatis默认实现缓存功能的类。我们不写type就使用mybatis默认的缓存也可以去实现 Cache 接口来自定义缓存。 我们可以看到 二级缓存 底层还是 HashMap 架构。 ②、po 类实现  Serializable  序列化接口 开启了二级缓存后还需要将要缓存的pojo实现Serializable接口为了将缓存数据取出执行反序列化操作因为二级缓存数据存储介质多种多样不一定只存在内存中有可能存在硬盘中如果我们要再取这个缓存的话就需要反序列化了。所以mybatis中的pojo都去实现Serializable接口。 ③、测试 一、测试二级缓存和sqlSession 无关 Test public void testTwoCache(){//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession1 sessionFactory.openSession();SqlSession sqlSession2 sessionFactory.openSession();String statement com.ys.twocache.UserMapper.selectUserByUserId;UserMapper userMapper1 sqlSession1.getMapper(UserMapper.class);UserMapper userMapper2 sqlSession2.getMapper(UserMapper.class);//第一次查询发出sql语句并将查询的结果放入缓存中User u1 userMapper1.selectUserByUserId(1);System.out.println(u1);sqlSession1.close();//第一次查询完后关闭sqlSession//第二次查询即使sqlSession1已经关闭了这次查询依然不发出sql语句User u2 userMapper2.selectUserByUserId(1);System.out.println(u2);sqlSession2.close(); } 可以看出上面两个不同的sqlSession,第一个关闭了第二次查询依然不发出sql查询语句。 二、测试执行 commit() 操作二级缓存数据清空 Test public void testTwoCache(){//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession1 sessionFactory.openSession();SqlSession sqlSession2 sessionFactory.openSession();SqlSession sqlSession3 sessionFactory.openSession();String statement com.ys.twocache.UserMapper.selectUserByUserId;UserMapper userMapper1 sqlSession1.getMapper(UserMapper.class);UserMapper userMapper2 sqlSession2.getMapper(UserMapper.class);UserMapper userMapper3 sqlSession2.getMapper(UserMapper.class);//第一次查询发出sql语句并将查询的结果放入缓存中User u1 userMapper1.selectUserByUserId(1);System.out.println(u1);sqlSession1.close();//第一次查询完后关闭sqlSession//执行更新操作commit()u1.setUsername(aaa);userMapper3.updateUserByUserId(u1);sqlSession3.commit();//第二次查询由于上次更新操作缓存数据已经清空防止数据脏读这里必须再次发出sql语句User u2 userMapper2.selectUserByUserId(1);System.out.println(u2);sqlSession2.close(); } 查看控制台情况 ④、useCache和flushCache mybatis中还可以配置userCache和flushCache等配置项userCache是用来设置是否禁用二级缓存的在statement中设置useCachefalse可以禁用当前select语句的二级缓存即每次查询都会发出sql去查询默认情况是true即该sql使用二级缓存。 select idselectUserByUserId useCachefalse resultTypecom.ys.twocache.User parameterTypeintselect * from user where id#{id} /select 这种情况是针对每次查询都需要最新的数据sql要设置成useCachefalse禁用二级缓存直接从数据库中获取。 在mapper的同一个namespace中如果有其它insert、update、delete操作数据后需要刷新缓存如果不执行刷新缓存会出现脏读。 设置statement配置中的flushCache”true” 属性默认情况下为true即刷新缓存如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。 select idselectUserByUserId flushCachetrue useCachefalse resultTypecom.ys.twocache.User parameterTypeintselect * from user where id#{id} /select 一般下执行完commit操作都需要刷新缓存flushCachetrue表示刷新缓存这样可以避免数据库脏读。所以我们不用设置默认即可。 欢迎工作一到五年的Java工程师朋友们加入Java高级交流698581634。群内提供免费的Java架构学习资料有SpringMyBatisNetty源码分析高并发、高性能、分布式、微服务架构的原理JVM性能优化等...这些成为架构师必备的知识体系。 合理利用自己每一分每一秒的时间来学习提升自己不要再用没有时间“来掩饰自己思想上的懒惰趁年轻使劲拼给未来的自己一个交代 转载于:https://my.oschina.net/u/3967312/blog/2050464
http://www.ihoyoo.com/news/19439.html

相关文章:

  • 校园网站建设培训的心得体会网站规划要点
  • 网站降权处理网站开发线上销售技巧
  • 建设网站平台电子商务网站建设与管理课后心得
  • 无锡网站建设制作开发网站开发的挑战
  • 网站制作什么做新手做网站教程
  • wordpress有插件怎么用站长工具seo综合查询外部链接数量
  • 保定做网站开发的公司有哪些网站首页分类怎么做的
  • 品牌网站建设精湛磐石网络网站建设考试多选题
  • 网站如何做背景音乐多城市地方门户网站系统
  • 购物网站开发需要什么技术建立网站 知乎
  • 服务网站欣赏做博客网站赚钱吗
  • 交易网站开发文档wordpress账户密码为空
  • 如何做外贸品牌网站建设怎么开公司
  • 成都建网站云尚网络科技有限公司介绍
  • 创一家网站家具网站建设的背景
  • 青岛网站开发哪家好自己可以建设环保公益网站吗
  • 做网站和易语言电子商务的工作岗位有哪些?
  • 滁州seo网站推广方案开发工程师是程序员吗
  • asp网站文章自动更新网页打不开用什么浏览器
  • 株洲做网站定制苏州百度推广排名优化
  • 东莞网站建设培训班新余集团网站建设
  • 深圳网站搜索排名潍坊专业网站建设公司
  • 小说阅读网站系统模板下载建立一个app要多少钱
  • 建设网站的源代码网站开发需要会什么
  • 巴州区建设局网站网络推广网站培训班
  • 南京网站制作联系宋网站视频不能下载怎么保存视频
  • 游戏logo设计网站wordpress更新500错误
  • 四平网站seo北京企业查询
  • 站长工具源码优化网站链接的方法
  • 网站建设用dw白云做网站的公