zoukankan      html  css  js  c++  java
  • JavaEE Mybatis(三)一级缓存与二级缓存

    1. 缓存的使用

    用户可以将查询到的实体类放到缓存中,使后面的 select 得以复用,这会提高程序的运行效率。

    MyBatis 缓存分为一级缓存和二级缓存。

    (一)一级缓存由 SqlSession 对象管理,每个 SqlSession 有自己所属的一级缓存。

    (二)二级缓存由 SqlSessionFactory 对象管理,是 Application 级别。

    2. 一级缓存

    一级缓存是 MyBatis 默认提供并开启的,每个 SqlSession 都有自己所属的一级缓存。

    创建一个 session 对象如下:

    SqlSession session = factory.openSession();
    
    Userinfo userinfo1 = session.selectOne("getUserinfoById", 4L);
    Userinfo userinfo2 = session.selectOne("getUserinfoById", 4L);
    
    //输出信息
    

    运行结果显示 Session 只执行了一次 sql 语句查询。

    说明在同一个 SqlSession 中复用了 Userinfo 对象。

    但不同的 SqlSession 对象缓存中的数据不可以共享。

    因此如果想实现不同 SqlSession 缓存中的数据可以共享,那么需要使用二级缓存。

    3. 二级缓存

    创建二级缓存只需要在 SQL 映射文件中添加配置代码

    <cache></cache>
    

    在 SQL 映射文件中使用了该配置后具有如下两个特性。

    (1)当为 select 语句时:flushCache 默认为 false,表示任何时候语句被调用,都不会清空本地缓存和二级缓存,因为查询操作并没有将数据进行更改,不需要刷新缓存中的数据。useCache 默认属性为 true,表示会将当前 select 语句查询的结果放入二级缓存中。

    (2)当为 insert、update、delete 语句时:flushCache 默认为 true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空,因为数据被更改了。

    具体实现代码如下:

    SqlSession session1 = factory.openSession();
    SqlSession session2 = factory.openSession();
    
    Userinfo userinfo1 = session1.selectOne("getUserinfoById");
    //输出调用
    session1.commit();
    session1.close();
    //注意:在查询完 userinfo1 之后要将 sqlsession1 进行提交和关闭
    //目的是将 userinfo1 对象放入二级缓存中,以备让新的 sqlsession2 对象从二级缓存中复用对象
    
    Userinfo userinfo2 = session2.selectOne("getUserinfoById");
    //输出调用
    session2.commit();
    session2.close();
    

    运行结果显示不同的 SqlSession 对象可以共享二级缓存中的实体类。

  • 相关阅读:
    8天学通MongoDB——第五天 主从复制
    5天不再惧怕多线程——第五天 线程池
    8天玩转并行开发——第四天 同步机制(上)
    8天学通MongoDB——第八天 驱动实践
    8天玩转并行开发——第三天 plinq的使用
    8天玩转并行开发——第一天 Parallel的使用
    8天玩转并行开发——第五天 同步机制(下)
    5天不再惧怕多线程——第一天 尝试Thread
    虚函数、纯虚函数详解
    libevent 笔记
  • 原文地址:https://www.cnblogs.com/john1015/p/13959697.html
Copyright © 2011-2022 走看看