远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

    • MyBatis

      • JDBC的问题分析
      • 自定义持久层框架的设计思路
      • 自定义持久层框架的代码实现一
      • 自定义持久层框架的代码实现二
      • 使用getMapper方式对自定义持久层框架进行优化
      • MyBatis的基本介绍及优势
      • MyBatis的基本使用
      • Mybatis基本流程及配置文件解析
      • MyBatis复杂映射开发之一对一查询
      • MyBatis复杂映射开发之一对多查询
      • MyBatis复杂映射开发之多对多查询
      • MyBatis常用注解及基本增删改查的注解实现
      • MyBatis的注解实现复杂映射开发
      • MyBatis缓存的概念
      • MyBatis的一级缓存
      • MyBatis的二级缓存
      • MyBatis的二级缓存整合redis
        • MyBatis 自带的二级缓存存在的问题
        • MyBatis 二级缓存在分布式环境下的问题解决
        • 怎么自定义 MyBatis 的二级缓存
        • 使用 redis 作为 MyBatis 的二级缓存
      • MyBatis-RedisCache源码分析
  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

  • 后端开发
  • 开源框架
  • MyBatis
terwer
2023-02-13
目录

MyBatis的二级缓存整合redis

# MyBatis 自带的二级缓存存在的问题

在前面我们使用 @CacheNamespace​ 实现了 430.MyBatis的二级缓存 ,这个底层使用 HashMap​ 来实现。在 单机环境 下没有问题,但是在 分布式环境 下就不行了。

​​

# MyBatis 二级缓存在分布式环境下的问题解决

为了解决这个问题,可以使用 分布式缓存 保存 MyBatis 二级缓存的数据。

​​

# 怎么自定义 MyBatis 的二级缓存

可以在 @CacheNamespace​ 上面加上 implementation , 例如,默认的缓存可以写成:

@CacheNamespace(implementation = PerpetualCache.class)
1

# 使用 redis 作为 MyBatis 的二级缓存

使用 redis 作为 MyBatis 二级缓存的步骤如下:

导入 mybatis-redis 的 pom 包

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-redis</artifactId>
    <version>1.0.0-beta2</version>
</dependency>
1
2
3
4
5

修改,IUserMapper ​,加上相关注解

请参考:https://github.com/terwer/senior-java-engineer-road/blob/main/p7-skill/framework/mybatis/mybatis-annotation/src/main/java/com/terwergreen/mapper/IUserMapper.java#L25 (opens new window)

@CacheNamespace(implementation = RedisCache.class)
public interface IUserMapper {
1
2

​resource​ 根目录 ​加上 redis.properties​ 配置文件

host=localhost
port=6379
password=
database=0
1
2
3
4

特别提醒:这里的 配置 不要写错了。

注意: 查询方法 ​也得地加上 @Options(useCache = true)​ 注解

@Options(useCache = true)
@Select("select * from user where id=#{id}")
User findUserById(Integer id);
1
2
3

测试:

请参考:https://github.com/terwer/senior-java-engineer-road/blob/main/p7-skill/framework/mybatis/mybatis-annotation/src/test/java/com/terwergreen/mapper/SecondCacheTest.java#L30 (opens new window)

@Test
public void secondLevelCache() {
    SqlSession sqlSession1 = sqlSessionFactory.openSession();
    SqlSession sqlSession2 = sqlSessionFactory.openSession();

    IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class);
    IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class);

    User user1 = userMapper1.findUserById(1);
    // 清空一级缓存
    sqlSession1.close();
    User user2 = userMapper2.findUserById(1);
    System.out.println(user1 == user2);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

结果:

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
==>  Preparing: select * from user where id=?
==> Parameters: 1(Integer)
<==    Columns: id, username, password, birthday
<==        Row: 1, lisi, 123, 2019-12-12
<==      Total: 1
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6b81ce95]
Returned connection 1803669141 to pool.
Cache Hit Ratio [com.terwergreen.mapper.IUserMapper]: 0.5
false
1
2
3
4
5
6
7
8
9
10
11

查看 redis 缓存

​​

编辑 (opens new window)
#二级缓存#使用#问题#加上#环境
上次更新: 2023/02/22, 13:47:25
MyBatis的二级缓存
MyBatis-RedisCache源码分析

← MyBatis的二级缓存 MyBatis-RedisCache源码分析→

最近更新
01
解决css部分border被圆角切掉之后圆角的边框消失问题
03-18
02
使用TypeScript开发一个自定义的Node-js前端开发脚手架
03-08
03
Github-Actions使用release-please实现自动发版
03-06
更多文章>
Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式