shardingjdbc简单使用之分库分表

2、shardingjdbc简单使用之分库分表综合使用
shardingjdbc作为shardingsphere中的一部分,提供了分库分表、读写分离、数据治理等功能
分库分表
分库就是按数据库来分:将不同或者相同结构的表分别放在不同的数据库中(例如用户表和订单表放在不同的库)
分表就是按表来分:将相同结构的水平拆分成多个不同名称的表(例如将user表分为user_0、user_1…)
分片键:不管分库还是分表,最终都是存储在表中,分片键就是按照表的某一个字段和分库分表策略进行分配
逻辑表:比如数据库中表是user_0,user_1…,而在代码里sql操作的表是逻辑表,底层会按照分片键和分片策略解析出对应具体的表(如果sql中包含分片键),如果没有分片键就会向所有实际存储表中做对应的操作

文章目录

分库

springboot+shardingsphere简单使用分库
数据库操作使用mybatisplus
创建两个database并创建相同结构的表,本文分库只使用table_1,table_2用于分表
在这里插入图片描述
表结构:sex字段存0和1
在这里插入图片描述
mybatis配置省略
分库的yml文件配置

spring:
  shardingsphere:
  	props:
      sql:
        show: true #开启sql日志
    datasource:
      names: db1,db2
      db1:
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2b8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
      db2:
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2b8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
    sharding:
      tables:
      	#逻辑表名,数据库中表名叫table_1,代码中的sql查询就使用逻辑表名
        user:
         #实际存储的数据库表,行表达式等价于db1.table_1,db2.table_1
          actual-data-nodes: db$->{1..2}.table_1
          key-generator:
            column: id #自定填充字段
            type: SNOWFLAKE
          database-strategy: #分库策略
            inline: #分片策略(inline,hint,standard,complex,none)
              sharding-column: sex #分片键 按sex字段分库(0:女 1:男)
              algorithm-expression: db$->{sex % 2 + 1} # 性别女存db1,男存db2

测试插入数据:

	@Test
    void insert() {
        User user = new User();
        user.setName("mary");
        user.setAge(19);
        user.setSex(0);
        userMapper.insert(user);
        System.out.println(user.getId());
    }

存入的数据sex值时0,应该被存到db1;
在这里插入图片描述
那么如果操作数据时不包含分片键字段会怎么样?这里就是sex字段
插入时不指定sex字段会怎么样

	@Test
    void inserts() {
        User user = new User();
        user.setName("jack");
        user.setAge(22);
        //user.setSex(0);
        userMapper.insert(user);
        System.out.println(user.getId());
    }

sql日志就能看出结果:
在这里插入图片描述
如果sql操作中不包含分片键字段 会向所有的实际存储节点插入数据

分表

这里所说的分表是水平分表,即按照分片键将数据存入多个表中。而垂直分表则是按字段将表拆分。
在同一数据库下创建两个结构相同的表用于分表测试:
在这里插入图片描述

spring:
  shardingsphere:
    datasource:
      names: db
      db:
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://localhost:3306/db?serverTimezone=GMT%2b8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: 123456
    sharding:
      tables:
        #逻辑表名
        user:
          actual-data-nodes: db.table_$->{[1,2]} #事件存储数据的表
          #actual-data-nodes: db.table_1,db.table_2
          key-generator:
            column: id #自定填充字段
            type: SNOWFLAKE #雪花算法  UUID、SNOWFLAKE两种(实现ShardingKeyGenerator接口)
          table-strategy: #分表策略
            inline:
              sharding-column: id #分片键
              algorithm-expression: table_$->{id % 2 + 1} #分片具体策略

sharding-column: id
algorithm-expression: table_$->{id % 2 + 1}
这里是按id进行分片,id值由SNOWFLAKE(雪花算法)生成,奇数id存table_2,偶数id存table_1
测试插入数据:

		User user = new User();
        user.setName("green");
        user.setAge(19);
        user.setSex(0);
        userMapper.insert(user);
        System.out.println(user.getId());

由控制台日志可以看出,生成的id是偶数存入到table_1中

Actual SQL: db ::: INSERT INTO table_1   (id, age, name, sex) VALUES (?, ?, ?, ?) ::: [1475275875025264642, 19, green, 0]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一些关于使用SpringBoot ShardingJDBC MyBatis进行分库分表的建议,例如:1. 使用ShardingSphere框架定义数据库分片策略;2. 使用MyBatis实现MyBatis SQL脚本;3. 使用SpringBoot注解的方式定义数据源和ShardingJDBC的配置。 ### 回答2: 使用SpringBoot ShardingJDBC和MyBatis可以很方便地实现分库分表功能。首先,ShardingJDBC是一个轻量级的数据库中间件,可以将数据分散到不同的数据库实例中,从而实现分库的效果。其次,MyBatis是一个流行的持久层框架,可以通过XML或注解的方式与数据库进行交互。 在使用SpringBoot ShardingJDBC和MyBatis做分库分表时,首先需要配置ShardingJDBC的数据源和分片规则。可以通过编写一个配置类来配置分库分表的规则,例如可以根据某个字段的取值来确定数据应该分散到哪个库或表中。配置完成后,就可以在MyBatis的Mapper接口中直接使用分库分表的数据源,从而实现对不同数据库或表的访问。 在编写Mapper接口时,可以使用MyBatis提供的注解或XML方式来编写SQL语句。在SQL语句中,可以使用ShardingJDBC提供的分片键来实现对特定库或表的访问。例如,在需要查询特定表的数据时,可以使用ShardingJDBC提供的Hint注解将查询操作路由到相应的表上。 总的来说,使用SpringBoot ShardingJDBC和MyBatis可以实现简单、高效的分库分表功能。通过配置ShardingJDBC的分片规则和使用MyBatis编写SQL语句,可以将数据分散到不同的数据库实例和表中,从而实现了水平扩展和负载均衡的效果。这种方式能够帮助我们提高数据库的性能和容量,从而更好地应对大规模的数据存储需求。 ### 回答3: 使用SpringBoot ShardingJDBC MyBatis可以轻松实现分库分表。 首先,ShardingJDBC是一个分库分表的开源框架,它可以通过数据库中间件实现数据的分散存储。而SpringBoot是一个快速构建项目的框架,可以帮助开发者轻松集成各种组件。 使用SpringBoot ShardingJDBC MyBatis进行分库分表,首先需要配置ShardingJDBC的数据源、分片策略以及分表策略。可以通过配置文件或者编程方式来完成配置。配置数据源时,可以指定多个数据库的连接信息,并使用分片策略将数据分配到不同的数据库中。配置分表策略时,可以指定不同的分表规则,将数据根据一定的规则分散存储在不同的表中。 在具体的业务逻辑中,可以使用MyBatis来操作数据库。MyBatis是一个简化数据库访问的持久层框架,通过编写SQL语句和映射文件,可以轻松实现数据库的增删改查操作。 在访问数据库时,ShardingJDBC会根据配置的分片策略和分表策略,自动将数据路由到指定的数据库和表中。开发者不需要关心数据的具体存储位置,只需要使用MyBatis的API进行数据操作即可。 使用SpringBoot ShardingJDBC MyBatis进行分库分表,可以提高数据库的读写性能,增加数据的存储容量,并且可以实现数据的动态扩容和迁移。此外,由于SpringBoot和MyBatis的高度集成,开发者可以更加方便地进行开发和维护。 总之,使用SpringBoot ShardingJDBC MyBatis进行分库分表可以帮助开发者更好地管理数据,提升系统的性能和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值