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><!--<!–当缓存闲置60秒后销毁–>-->
<property name="timeToLiveSeconds" value="160"></property><!--<!–缓存存在160秒后销毁–>-->
<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;
}
}
对应的数据表
properties配置文件添加扫描包
启动服务器访问localhost:8080/list
我们可以看到成功了
我们访问list1也是成功的,当我们刷新页面的时候发现sql语句不在打印了,说明是从二级缓存中提出来的数据
到这里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呢?直接放到内存不好吗?