Springboot + Mysql8实现读写分离功能


当前第2页 返回上一页

查看从服务器状态

show slave status\G;

至此数据库层面主从配置完成。

SpringBoot中配置主从读写分离

在主从模式下请遵守如下规则:
主数据库 只执行 INSERT,UPDATE,DELETE 操作
从数据库 只执行SELECT操作

我们这里使用开源项目[dynamic-datasource-spring-boot-starter](https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter/wikis/)作为读写分离的工具包

使用方法

在mydb主数据库中建立一个简单数据表user,建好后从数据库会自动同步

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`position` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

引入相关依赖

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
      <version>2.5.5</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

配置数据源

spring:
 datasource:
  dynamic:
   primary: master #设置默认的数据源或者数据源组,默认值即为master
   strict: false #设置严格模式,默认false不启动. 启动后再为匹配到指定数据源时候回抛出异常,不启动会使用默认数据源.
   datasource:
    master:
     type: com.zaxxer.hikari.HikariDataSource
     url: jdbc:mysql://192.168.249.131:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
     username: root
     password: '000000'
     driver-class-name: com.mysql.cj.jdbc.Driver
    slave_1:
     type: com.zaxxer.hikari.HikariDataSource
     url: jdbc:mysql://192.168.249.129:3306/mydb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
     username: root
     password: '000000'
     driver-class-name: com.mysql.cj.jdbc.Driver

在启动类入口加入mybatis扫描包

@SpringBootApplication@MapperScan("com.jianzh5.dynamic.mapper")
public class DynamicDatsourceBootstrap {  
  public static void main(String[] args) {    
    SpringApplication.run(DynamicDatsourceBootstrap.class, args);
  }
}

建立实体类User

@Data
public class User {
  private int id;
  private String account;
  private String name;
  private String position;
}

建立mapper接口文件,新增两个方法addUser(User user),getById(int id)

public interface UserDao {
  @Insert("INSERT INTO user(account, name, position) VALUES(#{account}, #{name}, #{position})")
  @Options(useGeneratedKeys = true,keyProperty = "id")
  int addUser(User user);

  @Select("SELECT * FROM user WHERE id = #{id}")
  User getById(int id);
}

建立Service服务层相关实现

public interface UserService {
    int addUser(User user);
    User getById(int id);
}
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    @Override
    public int addUser(User user) {
      return userDao.addUser(user);
    }
    @DS("slave")
    @Override
    public User getById(int id) {
      return userDao.getById(id);
    }
}

由于在数据源中配置了primary: master,默认操作都会从主库执行,使用注解@DS切换数据源,此注解也可直接用于类文件上,同时存在方法注解优先于类上注解。

编写单元测试进行测试

public class UserServiceTest extends DynamicDatsourceBootstrapTests {
  @Autowired
  private UserService userService;
  @Test
  public void testAddUser(){
    User user = new User();
    user.setName("李四");
    user.setAccount("sili");
    user.setPosition("JAVA开发工程师");
    int i = userService.addUser(user);
    System.out.println(user);
  }
  @Test
  public void testGetById(){
    int id = 4;
    User user = userService.getById(id);
    Assert.assertEquals("sanzhang",user.getAccount());
  }
}

通过观察执行日志,发现读写数据库会根据@DS注解进行切换,至此Springboot集成数据库主从读写分离完成。

总结

以上所述是小编给大家介绍的Springboot + Mysql8实现读写分离功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

jdbc连接操作mysql,直接操作和预处理方式

navicat是mysql

mysql如何进行表连接

一分钟带你了解mysql ddl

mysql百万级数据量分页查询方法及其优化建议

浅谈mysql清空表数据的两种方式和区别

mysql怎么查看有没有索引?

通过navicat如何实现mysql远程连接

mysql分片分区分库分表

mysql令人大跌眼镜的隐式转换

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...