[shardingSphere 使用与场景1] shardingSphere与mybatis集成,分库分表

本章目的为了快速搭建 shardingSphere 所讲解,提一些基本概念。

分片

垂直分片

按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。 在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。

水平分片

水平分片又称为横向拆分。 相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。

SQL

逻辑表

水平拆分的数据库(表)的相同逻辑和数据结构表的总称。
例:用户表根据地区划分,tb_user_shanghai, tb_user_shenzhen等等,他們的逻辑表为tb_user

真实表

在分片的数据库中真实存在的物理表。
tb_user_shanghai, tb_user_shenzhen为真实表,也叫物理表

数据节点

数据分片的最小单元。
由数据源名称和数据表组成,例:portal.tb_user_shenzhen

绑定表

指分片规则一致的主表和子表。例如: t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
例子:
在不配置绑定表关系时, 路由的 SQL

SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

在配置绑定表关系后,路由的 SQL

SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);

广播表

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。

内核剖析

核心由 SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并 的流程组成
在这里插入图片描述

sharding 入门使用

项目集成框架

shardingSphere
使用 5.0.0-alpha 版本

<!-- spring-web -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
	<version>${shardingsphere.version}</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.16</version>
</dependency>

<!-- mybatis -->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.18</version>
</dependency>

配置事务处理器

配置dataSource是在 shardingsphere-jdbc-core-spring-boot-starter 自动管理的, 可以直接使用。

@Configuration
public class DatabaseConfig {

    @Resource
    private DataSource dataSource;

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }
}

使用springboot 的 shardingSphere 配置

配置需注意:
1.连接池

若使用com.alibaba.druid.pool.DruidDataSource使用(url, username, password)
若使用com.zaxxer.hikari.HikariDataSource 使用(jdbcUrl,username,password)

2.开启使用

spring.shardingsphere.enabled=true

spring:
  shardingsphere:
    sharding:
      default-database-strategy: # 默认数据库策略
        standard:
          sharding-column: id
          sharding-algorithm-name: database-default
#      default-table-strategy: # 默认数据表策略
#        standard:
#          sharding-column: id
#          sharding-algorithm-name: table-default
    enabled: true
    props:
      sql-show: true
    datasource:
      common:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
      names: ds0,ds1
      ds0:
        url: jdbc:mysql://127.0.0.1:3306/db0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password:
      ds1:
        url: jdbc:mysql://127.0.0.1:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password:
    rules:
      sharding:
        broadcast-tables: tb_dict # 广播表
        key-generators: # 分布式主键策略
          snowflake: # 策略名自定义
            type: SNOWFLAKE
            props:
              worker-id: 123
        sharding-algorithms: # 数据分片策略
          table-order-id:
            type: INLINE
            props:
              algorithm-expression: tb_order$->{order_id % 5}
          table-intype:
            type: INLINE
            props:
              algorithm-expression: tb_view_log_$->{log_type}
          database-default:
            type: INLINE
            props:
              algorithm-expression: ds1
          database-inline:
            type: INLINE
            props:
              algorithm-expression: ds0
        tables: # 表配置
          tb_dict:
            key-generate-strategy:
              column: id
              key-generator-name: snowflake
          tb_order:
            actual-data-nodes: ds$->{0..1}.tb_order$->{0..4}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table-order-id
            database-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: database-inline
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
          tb_view_log:
            actual-data-nodes: ds0.tb_view_log_article,ds0.tb_view_log_product
            table-strategy:
              standard:
                sharding-column: log_type
                sharding-algorithm-name: table-intype
            database-strategy:
              standard:
                sharding-column: id
                sharding-algorithm-name: database-inline

shardingShere的SQL运行情况

  • Logic SQL 是代码中的SQL
  • Actual SQL 是物理库执行的SQL

插入SQL:
逻辑表:tb_view_log
物理表:tb_view_log_article,tb_view_log_product
SELECT id, user_id ,log_type from tb_view_log 根据分片规则,log_type字段数据分别插入到不同的数据表
在这里插入图片描述

查询SQL:
逻辑表:tb_view_log
物理表:tb_view_log_article,tb_view_log_product
SELECT id, user_id ,log_type from tb_view_log 根据分片规则,log_type字段向所有分片表查询数据并拼接起来
在这里插入图片描述

tb_view_log_article数据
在这里插入图片描述
tb_view_log_product数据
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

霸道产品爱上我

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

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

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

打赏作者

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

抵扣说明:

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

余额充值