Spring boot 2.X 配置使用Mybatis二级缓存

1.这里整理一下关于Spring boot 2.x中配置Mybatis缓存的问题

 Mybatis有两级缓存,默认一级缓存是开启的,二级缓存是关闭的。合理的使用缓存在优化当中最常见了

这里讲一下优化缓存的重要性:学过c都知道一切文件皆地址,计算机只能识别二进制,所有文件在存储过程中都是将文件转换为二进制来储存的。cpu处理信息的过程是,将文件复制到内存,cpu从内存中读取数据,执行文件。内存的大小在很大程度上决定了程序执行的快慢。那么把数据反正内存当中无疑是增加了程序的读取速度。所以缓存优化很重要。

2.进入正题:

 新建maven 项目Spring boot 2.x。

添加mybatis依赖:

<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.2</version>
</dependency>

新建实体类user

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    /**
     * 名称
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 地址
     */
    private String address;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

新建持久化接口

public interface UserMapper {
    public List<User> findAll();
}

对应的UserMapper文件:

<?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.example.xitong.common.dao.UserMapper">
  <cache type="org.mybatis.caches.ehcache.EhcacheCache">
        <property name="timeToIdleSeconds" value="60"></property><!--&lt;!&ndash;当缓存闲置60秒后销毁&ndash;&gt;-->
        <property name="timeToLiveSeconds" value="160"></property><!--&lt;!&ndash;缓存存在160秒后销毁&ndash;&gt;-->
        <property name="maxEntriesLocalHeap" value="1000"></property>
        <property name="maxEntriesLocalDisk" value="10000000"></property>
        <property name="memoryStoreEvictionPolicy" value="LRU"></property>
    </cache>
    <select id="findAll" resultType="User">
        select * from user
    </select>
</mapper>

服务层 UserService和实现文件就不在赘述了。

 

新建controller:

@RestController
/**自动返回的是json格式数据***/
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/list")
    public List<User> list(){
        List<User> list = userService.findAllUser();
        return list;
    }
    @RequestMapping("/list1")
    public List<User> list1(){
        List<User> list = userService.findAllUser();
        return list;
    }
}

对应的数据表

Spring boot 2.X 配置使用Mybatis二级缓存

 

 

 

 

properties配置文件添加扫描包

启动服务器访问localhost:8080/list

我们可以看到成功了

Spring boot 2.X 配置使用Mybatis二级缓存

 

我们访问list1也是成功的,当我们刷新页面的时候发现sql语句不在打印了,说明是从二级缓存中提出来的数据

Spring boot 2.X 配置使用Mybatis二级缓存

 

到这里Spring boot 2.x的Mybatis结合缓存启动就完成了。

最后补充一下一级缓存和二级缓存的区别:

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。
*  不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。
*      一级缓存工作原理:用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取;
* 如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。
* 但sqlSession执行事物,即增删改操作时会清空缓存。这么做的目的是避免脏读。(脏读即无效数据读取)
*
* 二级缓存:二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。
*      实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,
* 这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。
* 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。
* 最终:spring整合之后,如果没有事务,一级缓存是没有意义的。
*

文采不好,不喜请随便喷..................后续:我会贴出注释方式的使用以及缓存使用redis作为缓存地址的使用方式。思考下-为啥使用redis呢?直接放到内存不好吗?