栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码)

springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码) 一、整合sharding-jdbc

关于springboot整合sharding-jdbc官网有4种方式,而网上千篇一律都是用.properties文件。我在这里主要是用yml+bean两种方式结合,bean主要是为了实现分片键分片规则更灵活。

1.1引入maven依赖

这里有个小坑,我一开始引入是最新的sharding-jdbc和mybatis-plus的依赖,结果启动项目直接报错。所以个人不建议引用最新的包。


    org.apache.shardingsphere
    sharding-jdbc-spring-boot-starter
    4.0.0-RC1

1.2配置分库分表和读写分离(核心)
spring:
  shardingsphere:
    datasource:
      names: "search-center-00,search-center-00-slave,search-center-01,search-center-01-slave"
      search-center-00:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/search_center_00?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: 123456
      search-center-00-slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3307/search_center_00?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: 123456
      search-center-01:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/search_center_01?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: 123456
      search-center-01-slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3307/search_center_01?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
        username: root
        password: 123456
    sharding:
      master-slave-rules:
        search-center-00:
          master-data-source-name: search-center-00
          slave-data-source-names: search-center-00-slave
        search-center-01:
          master-data-source-name: search-center-01
          slave-data-source-names: search-center-01-slave
      tables:
        user:
          actual-data-nodes: search-center-$->{(0..1).collect{t ->t.toString().padLeft(2,'0')}}.user_$->{(0..1).collect{t ->t.toString().padLeft(2,'0')}}
          database-strategy:
            standard:
              shardingColumn: id
              precise-algorithm-class-name: com.gory.searchcenter.config.DatabaseAlgorithm
          table-strategy:
            standard:
              sharding-column: id
              precise-algorithm-class-name: com.gory.searchcenter.config.TableAlgorithm
    props:
      sql:
        show: true

names:自定义数据库名称,然后对这些名称进行具体的配置,如:url,password,username等

tables:对每个表进行分库分表。例如,这里对user表进行分库分表,

actual-data-nodes:则是user表分库分表的节点分配。

database-strategy:是分库的策略,我这里是根据id,然后通过bean方式更加灵活配置分库规则,

table-strategy:则是分表的策略,配置和分库大概一致。

master-slave-rules:设置主从实现读写分离,

DatabaseAlgorithm
public class DatabaseAlgorithm implements PreciseShardingAlgorithm {
    @Override
    public String doSharding(Collection databaseNames, PreciseShardingValue shardingValue) {
        Long shardResult = Math.abs((long) shardingValue.getValue().hashCode()) % 2;
        for (String databaseName : databaseNames) {
            String shardValue = String.format("%02d", shardResult);
            if (databaseName.endsWith(shardValue)){
                System.out.println("shardingValue:"+shardingValue+", databaseName:" + databaseName);
                return databaseName;
            }
        }
        throw new UnsupportedOperationException();
    }

}
TableAlgorithm
public class TableAlgorithm implements PreciseShardingAlgorithm {

    
    @Override
    public String doSharding(Collection tableNames, PreciseShardingValue shardingValue) {
        Long shardResult = Math.abs((long) shardingValue.getValue().hashCode()) / 2 % 2;
        for (String tableName : tableNames) {
            String shardValue = String.format("%02d", shardResult);
            if (tableName.endsWith(shardValue)){
                System.out.println("shardingValue:"+shardingValue+", tableName:" + tableName);
                return tableName;
            }
        }
        throw new UnsupportedOperationException();
    }

}

随便说一下,这里的分片主键id是用雪花算法设值的。你的分片键的赋值最好和你的分片规则对应上。

二、整合mybatis-plus

上一节已经说过了,引入最新的maven依赖会报错,所以我还是不建议用最新的。

2.1 引入maven依赖

    com.baomidou
    mybatis-plus-boot-starter
    3.2.0


    com.baomidou
    mybatis-plus-generator
    3.5.1

2.2 mybatis-plus的配置
mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

再启动类加上包扫表注解

@MapperScan({"com.gory.searchcenter.mapper"})
三、数据库主从配置

在上两节已经能完成分库分表了,但是因为数据库没设置主从,从表没有数据库,导致查询没有数据。因为此文章主要是为了学习,所以mysql的配置是在window环境的。

3.1my.ini配置 主库

#主库id不能重复

server_id=1

#开启bin-log

log_bin=E:libmysql-5.7.30-winx64master-bin.log

#mysql清除过期日志的时间与从库设置一致
expire_logs_days = 1

#设置需要同步的数据库
binlog-do-db=search_center_00
binlog-do-db=search_center_01
------------------------------------------------------------ |

从库

server_id=2

#开启bin-log

log_bin=E:libmysql-5.7.30-winx64-slaveslave-bin.log

expire_logs_days = 1

#设置需要同步的数据库
binlog-do-db=search_center_00
binlog-do-db=search_center_01
------------------------------------------------------------ |

值得一提,设置多个同步表,不能用逗号隔开。

3.1 sql配置 主库

开通从服务器( Slave )访问主服务器( Master )的权限

grant replication slave on . to ‘root’@‘127.0.0.1’ identified by ‘123456’;

查看授权信息

show master status ;

从库

停止同步

stop slave;

设置主库的信息,将从库和主库联系起来

change master to
master_host=’127.0.0.1’,
master_user=’root’,
master_password=’123456’,
master_log_file=’log-bin.000008’,
master_log_pos=107;
master_log_file和master_log_pos这两个 配置是和主 服务器 show master status对应的

启动同步

start salve;

查看slave启动状态

show slave status;

如果出现,则表明,启动成功。

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

四、完整的项目代码

完整的代码:https://github.com/gorylee/SearchCenter

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/292661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号