• SSM-MyBatis-17:Mybatis中一级缓存(主要是一级缓存存在性的证明,增删改对一级缓存会造成什么影响)


    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    缓存------------------------------------------》

      很熟悉的一个词,什么是缓存?

      好多人都不太能解释清楚缓存的概念,运用到缓存的地方大家都很清楚,像什么网站了,视频缓存啊,等等

      我从百度百科copy一个缓存的概念,读一下,免得看完这篇博客都对缓存的概念一无所知

      缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

    -------------------------------》

      有了一定概念了把,MyBatis中有些实现不同,不过意思相似,不然也不会叫做缓存

    MyBatis中一级缓存(他是默认开启的)

        在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。

        MyBatis缓存里面实则是个hashmap,key值为hashcode+selectId+sql语句,value为查询返回结果的内存地址的引用(指针),

    -------------------------------》

      哦,笔者你讲了这么多,不是废话吗?默认开启,不需要手动配置,手动使用,我看了有什么用?

      是为了更好的理解编程的灵魂,深入它的全部,才会有所成

    -------------------------------》

    一级缓存存在性的证明

      说了这么多,笔者你怎么知道有一级缓存存在呢?如果别人问我,我怎么更快的跟他解释清楚呢?

      单测方法

        /*一级缓存存在性证明sql*/
        @Test
        public void t2LevelOneCacheHasExist(){
            SqlSession session= MyBatisUtils.getSession();
    
            IDeptDAO mapper = session.getMapper(IDeptDAO.class);
            Dept d1 = mapper.findDeptnoALLEmpsMoreSql(1);
    
            System.out.println(d1.getDeptName());
            System.out.println("==================我是特别的高贵的分割线==================");
            Dept d2 = mapper.findDeptnoALLEmpsMoreSql(1);
            System.out.println(d2.getDeptName());
    
            session.close();
    
        }

      运行结果

        

       看到分割线下面了吗?没有对数据库做sql语句的查询操作,直接得的结果,难道还不能说明它中间有一道,从缓存中拿的结果吗?(上面俩条sql是因为做的关联查询的直接加载)

    --------------------------------------》

    增删改对一级缓存的影响:

      口说无凭,我直接放代码

      单测方法

      

        /*增删改对一级缓存的影响*/
        @Test
        public void t3IUDForLevelOneCache(){
            SqlSession session= MyBatisUtils.getSession();
    
            IDeptDAO mapper = session.getMapper(IDeptDAO.class);
            Dept d1 = mapper.findDeptnoALLEmpsMoreSql(1);
    
            System.out.println(d1.getDeptName());
    
            Dept dept=new Dept();
            dept.setDeptName("无敌是多么寂寞部");
            mapper.addDept(dept);
            System.out.println("==================我是特别的高贵的分割线==================");
            Dept d2 = mapper.findDeptnoALLEmpsMoreSql(1);
            System.out.println(d2.getDeptName());
    
            session.close();
    
        }

      下面我放运行结果

        

      在分割线后又做了查询,说明了增删改会对缓存进行清空操作,清空操作

    本次博客说明了mabatis中一级缓存的存在性证明 (存在的),增删改对一级缓存的影响(会清空一级缓存)-----》

    透露一下,下次博客:《mybatis二级缓存》

  • 相关阅读:
    抽象线程之Parallel类
    任务
    创建线程之Thread类和线程池
    创建线程之异步委托
    折半插入排序
    单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)
    插入排序
    [Python]小甲鱼Python视频第034课(with else)课后题及参考解答
    [Python]小甲鱼Python视频第033课(except)课后题及参考解答
    [Python]小甲鱼Python视频第32课(except)课后题及参考解答
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/8480762.html
Copyright © 2020-2023  润新知