Mybatis二级缓存的简单应用

1.接口

public interface MemberMapperCache {

    public Members selectMembersById(Integer id);

}

2.POJO类

实现序列化接口

public class Members implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String member_name;

    private Integer age;

    private Integer gender;

    private String email;

    public Members() {}

    public Members(Integer id, String member_name, Integer age, Integer gender, String email) {
        super();
        this.id = id;
        this.member_name = member_name;
        this.age = age;
        this.gender = gender;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

    public String getMember_name() {
        return member_name;
    }

    public Integer getAge() {
        return age;
    }

    public Integer getGender() {
        return gender;
    }

    public String getEmail() {
        return email;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setMember_name(String member_name) {
        this.member_name = member_name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Members [id=" + id + ", member_name=" + member_name + ", age=" + age + ", gender=" + gender + ", email=" + email + "]";
    }

}

3.mapper.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.MemberMapperCache">
    <!--
        eviction:缓存的回收策略
            LRU:最近最少使用的,移除最长时间不被使用的对象
            FIFO:先进先出,按对象进入缓存的顺序来移除他们
            SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
            WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象
            默认是LRU
        flushInterval:缓存刷新间隔
            默认不清空
        readOnly:是否只读
            true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据
                mybatis为了加快获取速度,直接将数据在缓存中的引用交给用户,不安全,但是速度快
            false:非只读:mybatis觉得获取的数据可能会被修改,并会用序列化和反序列化技术克隆一份新的数据
                再给用户,这样安全,但是速度相对慢
                默认false,非只读
        size:缓存中存放多少个元素
        type:自定义缓存,实现Cache接口集合,type="全类名"

        ===>POJO必须实现序列化接口
     -->

    <cache eviction="LRU" flushInterval="60000" readOnly="false" size="1024"></cache>

    <select id="selectMembersById" resultType="members">

        select * from members where id = #{id}

    </select>

</mapper>

4.全局配置文件

开启二级缓存和日志打印

    <settings>
        <!-- 打印log日志 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

5.测试类

    /**
     * Mybatis的缓存机制
     * 二级缓存:
     *         1.在全局配置文件中开启二级缓存
     *         2.在mapper.xml文件中加入<cache><cache/>标签
     *         3.POJO实现序列化接口
     */
    public static void main(String[] args) throws IOException {
        // 获取两个不同的session
        SqlSession session1 = getSqlSession();
        SqlSession session2 = getSqlSession();
        try {
            // 获取两个不同的mapper
            MemberMapperCache mapper1 = session1.getMapper(MemberMapperCache.class);
            MemberMapperCache mapper2 = session2.getMapper(MemberMapperCache.class);
            // 获取id为1的对象
            Members member1 = mapper1.selectMembersById(1);
            System.out.println(member1.toString());
            session1.close();
            // 获取id为1的对象
            Members member2 = mapper2.selectMembersById(1);
            System.out.println(member2.toString());
            session2.close();
        } finally {

        }
    }

    public static SqlSession getSqlSession() throws IOException {
        // 读取全局配置文件
        String resource = "conf/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 打开session
        SqlSession session = sqlSessionFactory.openSession();
        return session;
    }

mybatis的二级缓存是namespace级别的缓存,也就是mapper级别的缓存,则mapper中所有的select语句默认都将被缓存,此命名空间下所有insert、update、delete语句将会导致空间下的缓存被清空

在单表操作的情况下用二级缓存是没什么问题的,但是在多关联中,用二级缓存就存在很大的风险,这里我百度搜了一下,有好多栗子,就不列举了,原链接是   https://www.cnblogs.com/liouwei4083/p/6025929.html

还是不推荐是用mybatis自带的缓存机制,还是在业务层用自己能控制的缓存比较稳妥

原文地址:https://www.cnblogs.com/zhangjianbing/p/8360616.html

时间: 2024-10-28 14:25:12

Mybatis二级缓存的简单应用的相关文章

如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现)

前几天网友chanfish 给我抛出了一个问题,笼统地讲就是如何能细粒度地控制MyBatis的二级缓存问题,酝酿了几天,觉得可以写个插件来实现这个这一功能.本文就是从问题入手,一步步分析现存的MyBatis的二级缓存的不足之处,探讨一点可以改进的地方,并且对不足之处开发一个插件进行弥补. 本文如下组织结构: 一个关于MyBatis的二级缓存的实际问题 当前MyBatis二级缓存的工作机制 mybatis-enhanced-cache插件的设计和工作原理 mybatis-enhanced-cach

深入了解MyBatis二级缓存

深入了解MyBatis二级缓存 标签: mybatis二级缓存 2015-03-30 08:57 41446人阅读 评论(13) 收藏 举报  分类: Mybatis(51)  版权声明:版权归博主所有,转载请带上本文链接!联系方式:[email protected] 目录(?)[+] 深入了解MyBatis二级缓存 一.创建Cache的完整过程 我们从SqlSessionFactoryBuilder解析mybatis-config.xml配置文件开始: Reader reader = Reso

MyBatis二级缓存配置

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存中取数据,而不用到数据库里去取了. 1. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用

使用redis做mybaties的二级缓存(2)-Mybatis 二级缓存小心使用

Mybatis默认对二级缓存是关闭的,一级缓存默认开启: 下面就说说为什么使用二级缓存需要注意: 二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的. 举个简单的例子,订单和订单详情,orderMapper.orderDetailMapper.在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orde

mybatis二级缓存详解

1  二级缓存简介 二级缓存是在多个SqlSession在同一个Mapper文件中共享的缓存,它是Mapper级别的,其作用域是Mapper文件中的namespace,默认是不开启的.看如下图: 整个流程是这样的(不考虑第三方缓存库): 当开启二级缓存后,在配置文件中配置<setting name="cacheEnabled" value="true"/>这行代码,Mybatis会为SqlSession对象生成Executor对象时,还会生成一个对象:C

[MyBatis]二级缓存

二级缓存: Session去执行该Mapper下的查询方法时(第一次查询),会将该查询结果存放在Mapper的二级缓存区域 Session去执行该Mapper下的查询方法时(第二次查询),会判断该Mapper下有没有缓存,如果有,则不向数据库查询,直接取缓存 Session去执行该Mapper下的commit()方法后,则清空该Mapper下的二级缓存 二级缓存与一级缓存的区别: 多个Session可以共享Mapper下的数据,二级缓存是按照Mapper的namespace划分,每一个Mappe

mybatis二级缓存问题

a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } a:hover { outline: 0; } a:active { outline: 0; } a:hover { color: #005580 !important; text-decoration: underline !important; } blockquote small:b

mybatis结合redis实战二级缓存(六)

之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSCache.Hazelcast结合使用.二级缓存相关的源码分享请参考<Mybatis源码分析之Cache二级缓存原理>.我们通过两种方式来实战,一种是自己编写缓存.另外一种是官方给出的demo地址:http://www.mybatis.org/redis-cache/ 一:自定义mybatis缓存

MyBatis的二级缓存的设计原理

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个 SqlSession对象会使用一个 Executor对象来完成会话操作, MyBatis的二级缓存机制的关键就是对这个 Executor对象做文章.如果用户配置了" cacheEnabled=true",那么 MyBatis在为 Sql