暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springboot集成mybatis-plus实现读写分离

程序员舒克 2021-03-26
425

点击上方蓝色字体关注公众号

目录

    01-简介

    02-依赖

    03-配置

    04-测试


01

简介

紧接上篇文章,搭建Mysql主从复制本篇简单介绍springboot配置多数据源实现读写分离
为什么要实现读写分离?
作为java开发,我们可以把CRUD操作分为两类,读操作、写操作,要知道I/O是影响性能的最主要的要素,如果将读操作和写操作分离开,数据库的压力也相对减轻了,当然我们在做业务的时候如果将同类业务进行归类,那我们的接口就更便于管理
02
依赖

我的项目用的ORM框架是mybatis+mybatis-plus,而恰巧mybatis-plus可以满足我的需求(读写分离或者叫多数据源),所以这里就直接引入mybatis-plus的多数据源包

            <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <!-- 目前官方的最高版本是3.3.2 -->
    <version>3.3.2</version>
    </dependency>

    03

    配置

    • yml格式

      Spring:
      datasource:
      dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: true #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
      datasource:
      master:
      url: jdbc:mysql://localhost:33061/master_slave_database?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true
      username: root
      password: root1234
      driver-class-name: com.mysql.cj.jdbc.Driver
      slave_1:
      url: jdbc:mysql://localhost:33062/master_slave_database?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true
      username: root
      password: root1234
      driver-class-name: com.mysql.cj.jdbc.Driver
      • properties格式

        Spring.datasource.dynamic.primary=master
        Spring.datasource.dynamic.strict=true
        Spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:33061/master_slave_database?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true
        Spring.datasource.dynamic.datasource.master.username=root
        Spring.datasource.dynamic.datasource.master.password=root1234
        Spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
        Spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://localhost:33062/master_slave_database?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true
        Spring.datasource.dynamic.datasource.slave_1.username=root
        Spring.datasource.dynamic.datasource.slave_1.password=root1234
        Spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.cj.jdbc.Driver




        04

        测试

        一看就会,一学就废,开个小玩笑,这个还是很容易操作的,我的配置文件中配置的数据库是一主一从,primary属性指定master为主库,如果你的从库只用于读数据的话,那增删改跟没配多数据源之前是没什么两样的,因为多数据源默认获取的就是master库,而从库只需要通过@DS注解来指明数据库即可,是不是特别简单
        • Service层代码

          @Service
          public class UserService extends ServiceImpl<UserMapper, User> {


          public boolean insert(User user) {
          return save(user);
          }


          @DS(value = "slave_1")
          public List<User> findAll() {
          return list();
          }
          }
          • TestApplication

            • 新增

            @RunWith(SpringJUnit4ClassRunner.class)
            @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
            public class TestApplication {


            @Resource
            private UserService userService;


            @Test
            public void testMasterSlave_Insert() {
            User user = new User();
            user.setName("小王");
            user.setPhone("17621298033");
            user.setSex("男");
            user.setAddress("浦东");
            boolean save = userService.insert(user);
            System.err.println(save);
            }
              }
            控制台日志
              2021-03-26 16:32:05,309 DEBUG [main] c.j.m.m.U.insert [BaseJdbcLogger.java:137] - ==>  Preparing: INSERT INTO user ( id, name, sex, phone, address ) VALUES ( ?, ?, ?, ?, ? )
              2021-03-26 16:32:05,790 DEBUG [main] c.j.m.m.U.insert [BaseJdbcLogger.java:137] - ==> Parameters: 1375364922683375617(Long), 小王(String), 男(String), 17621298033(String), 浦东(String)
              2021-03-26 16:32:05,807 DEBUG [main] c.j.m.m.U.insert [BaseJdbcLogger.java:137] - <== Updates: 1
                • 查询

                  • 查询之前,我们把从库中刚新增的这条数据的name改个名,改成从库名称,因为从库的数据是从主库读来的,那我们调用查询接口的时候怎么才能知道查来的数据是主库的还是从库的

                    @Test
                public void testMasterSlave_findAll() {
                List<User> list = userService.findAll();
                System.out.println(list);
                }
                控制台日志
                  2021-03-26 16:47:50,068 DEBUG [main] c.j.m.m.U.selectList [BaseJdbcLogger.java:137] - ==>  Preparing: SELECT id,name,sex,phone,address FROM user
                  2021-03-26 16:47:50,526 DEBUG [main] c.j.m.m.U.selectList [BaseJdbcLogger.java:137] - ==> Parameters:
                  2021-03-26 16:47:50,887 DEBUG [main] c.j.m.m.U.selectList [BaseJdbcLogger.java:137] - <== Total: 1
                  [User(id=1375364922683375617, name=从库名称, sex=男, phone=17621298033, address=浦东)]
                  看到name了吧,是我们改的,说明配置的读写分离成功了,观察下图,左侧是主库,右侧是从库


                  文章转载自程序员舒克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论