• mybatis的缓存2


    原文:https://blog.csdn.net/qq_38274974/article/details/100898145

    mybatis的缓存分为一级缓存、二级缓存
    那么,我们为什么要使用缓存呢?
           对于经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,这样就大大降低了效率,所以这里就引入了缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。

    一级缓存
           一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),在操作数据库时,每个SqlSession类的实例对象中有一个数据结构(HashMap)可以用来存储缓存数据,不同的SqlSession类的实例对象缓存的数据区域(HashMap)是互不影响的。当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。

    public class MyBatisTest {
        //mybatis的一级缓存,是SqlSession级别的缓存,只有一个SqlSession对象。
        @Test
        public void test1(){
            SqlSessionFactory ssf=MyBatisUtil.getFactory();
            SqlSession session=ssf.openSession();
            UserMapper um1=session.getMapper(UserMapper.class);
            User user1=um1.selectbyid(1);
            System.out.println(user1.getUsername());
            //session.clearCache();//清理缓存
            //session.commit();//模拟增删改
            UserMapper um2=session.getMapper(UserMapper.class);
            User user2=um2.selectbyid(1);
            System.out.println(user2.getUsername());
            session.close();
        }
    }

    结果:

    由此可见,因为缓存,只发生了一次与数据库的交互

    如何清理缓存?

    方法一:模拟增删改

    session.commit();

    方法二:调用clearCache()方法

    session.clearCache();

     而清理缓存后:

    二级缓存
           二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。对于访问多的查询请求且用户对查询结果实时性要求不高,此时便可采用mybatis的二级缓存。

     1.启动
    在核心配置文件mybatis-config.xml中加入

    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

    2.调用实体类实现序列化接口

    实现序列化接口的目的:
         ·为了将数据取出执行反序列化操作
         ·标记接口,打个标记,表示具有一些功能,可以被其它功能对象调用
         ·序列号有方法,可以将对象序列化成二进制文件,也可以将二进制文件反序列化成对象
    3.在对应的mapper.xml中加入cache标签

    4.测试

    @Test
        public void test2(){
        //mybatis的二级缓存,是mapper级别的缓存,有多个SqlSession对象。
            SqlSessionFactory ssf=MyBatisUtil.getFactory();
            SqlSession session1=ssf.openSession();
            SqlSession session2=ssf.openSession();
            SqlSession session3=ssf.openSession();
            UserMapper um1=session1.getMapper(UserMapper.class);
            User user1=um1.selectbyid(1);
            System.out.println(user1.getUsername());
            session1.close();
            
            UserMapper um2=session2.getMapper(UserMapper.class);
            User user2=um2.selectbyid(1);
            System.out.println(user2.getUsername());
            session2.close();
            
            UserMapper um3=session3.getMapper(UserMapper.class);
            User user3=um3.selectbyid(1);
            System.out.println(user3.getUsername());
            session3.close();
        }

    运行结果:

  • 相关阅读:
    关于table表格的一些问题
    leetcode 845. 数组中的最长山脉 做题笔记
    leetcode 845. 数组中的最长山脉 做题小结
    leetcode 925. 长按键入小结
    leetcode 925. 长按键入小结
    java单链表反转 详细讲述
    java单链表反转 详细讲述
    Leetcode 3. 无重复字符的最长子串 做题小结
    Leetcode 3. 无重复字符的最长子串 做题小结
    复变函数的幂函数
  • 原文地址:https://www.cnblogs.com/lvchengda/p/12598103.html
Copyright © 2020-2023  润新知