springboot使用sharding-jdbc分表分库/读写分离

pom依赖

<!--分表分库-->
<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
	<version>4.0.0-RC1</version>
</dependency>
<!--数据库连接池-->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.2.9</version>
</dependency>
<!--mybatis依赖-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.1</version>
</dependency>

创建数据表

  • 数据库A
DROP TABLE IF EXISTS resource_statistics_list_01;
CREATE TABLE resource_statistics_list_01(
    resource_id BIGINT NOT NULL   COMMENT '资源统计主键ID' ,
    resource_dosage INTEGER    COMMENT '资源用量' ,
    energy_type INTEGER    COMMENT '能源类型1=用电,2=用水' ,
    resource_type INTEGER    COMMENT '资源类型1=生产用电,2=照明用电,3=空调用电,4=生产用水,5=卫生间用水,6=中水用水' ,
    revision VARCHAR(64)    COMMENT '乐观锁' ,
    created_by VARCHAR(64)    COMMENT '创建人' ,
    created_time VARCHAR(64)    COMMENT '创建时间' ,
    updated_by VARCHAR(64)    COMMENT '更新人' ,
    updated_time VARCHAR(64)    COMMENT '更新时间' ,
    PRIMARY KEY (resource_id)
)  COMMENT = '资源统计表';


DROP TABLE IF EXISTS resource_statistics_list_02;
CREATE TABLE resource_statistics_list_02(
    resource_id BIGINT NOT NULL   COMMENT '资源统计主键ID' ,
    resource_dosage INTEGER    COMMENT '资源用量' ,
    energy_type INTEGER    COMMENT '能源类型1=用电,2=用水' ,
    resource_type INTEGER    COMMENT '资源类型1=生产用电,2=照明用电,3=空调用电,4=生产用水,5=卫生间用水,6=中水用水' ,
    revision VARCHAR(64)    COMMENT '乐观锁' ,
    created_by VARCHAR(64)    COMMENT '创建人' ,
    created_time VARCHAR(64)    COMMENT '创建时间' ,
    updated_by VARCHAR(64)    COMMENT '更新人' ,
    updated_time VARCHAR(64)    COMMENT '更新时间' ,
    PRIMARY KEY (resource_id)
)  COMMENT = '资源统计表';
  • 数据库B
DROP TABLE IF EXISTS resource_statistics_list_01;
CREATE TABLE resource_statistics_list_01(
    resource_id BIGINT NOT NULL   COMMENT '资源统计主键ID' ,
    resource_dosage INTEGER    COMMENT '资源用量' ,
    energy_type INTEGER    COMMENT '能源类型1=用电,2=用水' ,
    resource_type INTEGER    COMMENT '资源类型1=生产用电,2=照明用电,3=空调用电,4=生产用水,5=卫生间用水,6=中水用水' ,
    revision VARCHAR(64)    COMMENT '乐观锁' ,
    created_by VARCHAR(64)    COMMENT '创建人' ,
    created_time VARCHAR(64)    COMMENT '创建时间' ,
    updated_by VARCHAR(64)    COMMENT '更新人' ,
    updated_time VARCHAR(64)    COMMENT '更新时间' ,
    PRIMARY KEY (resource_id)
)  COMMENT = '资源统计表';

DROP TABLE IF EXISTS resource_statistics_list_02;
CREATE TABLE resource_statistics_list_02(
    resource_id BIGINT NOT NULL   COMMENT '资源统计主键ID' ,
    resource_dosage INTEGER    COMMENT '资源用量' ,
    energy_type INTEGER    COMMENT '能源类型1=用电,2=用水' ,
    resource_type INTEGER    COMMENT '资源类型1=生产用电,2=照明用电,3=空调用电,4=生产用水,5=卫生间用水,6=中水用水' ,
    revision VARCHAR(64)    COMMENT '乐观锁' ,
    created_by VARCHAR(64)    COMMENT '创建人' ,
    created_time VARCHAR(64)    COMMENT '创建时间' ,
    updated_by VARCHAR(64)    COMMENT '更新人' ,
    updated_time VARCHAR(64)    COMMENT '更新时间' ,
    PRIMARY KEY (resource_id)
)  COMMENT = '资源统计表';

SQL语句

  • resource_id不能写入sql中
  • sql中不能有空值否则报错Caused by: java.lang.NullPointerException
    <!--新增数据-->
    <insert id="insert">
        insert into resource_statistics_list(resource_dosage, energy_type, resource_type, created_by,
                                             created_time)
        values (#{resourceDosage}, #{energyType}, #{resourceType}, #{createdBy}, #{createdTime})
    </insert>

主从复制

spring:
 #分表分库配置
  shardingsphere:
    datasource:
      m1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://192.168.0.54:32689/energy_consumption_01?serverTimezone=GMT%2B8
        username: root
        password: DCH@2021
      m2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://192.168.0.54:32689/energy_consumption_02?serverTimezone=GMT%2B8
        username: root
        password: DCH@2021
      names: m1,m2
    #配置默认数据源ds0 默认数据源,主要用于写
    sharding:
    	#设置默认数据库连接
      default-data-source-name: m1
    #读写分离 单个读写分离
    masterslave:
      #配置主从名称
      name: dataSource
      #配置主库master,负责数据的写入
      master-data-source-name: m1
      #配置从库slave节点
      slave-data-source-names: m2
      #配置slave节点的负载均衡均衡策略,采用轮询机制
      load-balance-algorithm-type: round_robin
    # 显示sql
    props:
      sql:
        show: false
        # show: true

分库分表

spring:
 #分表分库配置
  shardingsphere:
    datasource:
      m1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://192.168.0.54:32689/energy_consumption_01?serverTimezone=GMT%2B8
        username: root
        password: DCH@2021
      m2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://192.168.0.54:32689/energy_consumption_02?serverTimezone=GMT%2B8
        username: root
        password: DCH@2021
      names: m1,m2
    #是否打印SQL
    props:
      sql:
        show: false
    sharding:
      #设置默认数据库连接
      default-data-source-name: m1
      tables:
        #需要替换的表名称
        resource_statistics_list:
          #指定数据库分布的情况和数据表分布的情况m1 m2   resource_statistics_list_01 resource_statistics_list_02
          actual-data-nodes: m$->{1..2}.resource_statistics_list_0$->{1..2}
          #指定分库策略
          database-strategy:
            inline:
              algorithm-expression: m$->{resource_id% 2 + 1}
              sharding-column: resource_id
          #指定表内主键生成策略
          key-generator:
            column: resource_id
            type: SNOWFLAKE
          #指定分表策略
          table-strategy:
            inline:
              algorithm-expression: resource_statistics_list_0$->{resource_type % 2 + 1}
              sharding-column: resource_type
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是 SpringBoot 集成 sharding-jdbc-spring-boot-starter 并使用 yml 配置多数据源的方式 进行 分表配置的步骤: 1. 首先,在 pom.xml 文件中添加 sharding-jdbc-spring-boot-starter 依赖,如下所示: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${shardingsphere.version}</version> </dependency> ``` 2. 在 application.yml 配置文件中添加数据源配置,如下所示: ```yml spring: datasource: # 主数据源 master: url: jdbc:mysql://localhost:3306/db_master?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8 username: root password: root # 从数据源 slave: url: jdbc:mysql://localhost:3306/db_slave?serverTimezone=UTC&useSSL=false&characterEncoding=utf-8 username: root password: root # sharding-jdbc 配置 sharding: jdbc: #配置主从数据源名称 data-sources: # 配置主数据源 master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: ${spring.datasource.master.url} username: ${spring.datasource.master.username} password: ${spring.datasource.master.password} hikari: minimum-idle: 5 maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: master # 配置从数据源 slave: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: ${spring.datasource.slave.url} username: ${spring.datasource.slave.username} password: ${spring.datasource.slave.password} hikari: minimum-idle: 5 maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: slave # 配置表规则 sharding: tables: # 配置分表规则 user: actual-data-nodes: master.user_${0..2} table-strategy: inline: sharding-column: id algorithm-expression: user_${id % 3} key-generator: type: SNOWFLAKE column: id props: worker-id: 123 # 配置读写分离规则 master-slave-rules: - name: ms master-data-source-name: master slave-data-source-names: slave ``` 3. 在代码中使用数据源,如下所示: ```java @Service public class UserServiceImpl implements UserService { @Autowired private JdbcTemplate jdbcTemplate; @Override public void addUser(User user) { String sql = "insert into user(id, name, age) values(?, ?, ?)"; Object[] params = new Object[]{user.getId(), user.getName(), user.getAge()}; jdbcTemplate.update(sql, params); } @Override public List<User> getUsers() { String sql = "select * from user"; List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); return userList; } } ``` 希望这些步骤能够帮助你集成 sharding-jdbc-spring-boot-starter 并使用 yml 配置多数据源的方式进行分表配置。如果你有更多的问题,欢迎随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索悻流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值