ShardingSphere-JDBC-若依框架集成(SpringBoot)

news/2024/11/29 13:34:57/

前言

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中
使用的是若依框架(SpringBoot)前后端版本、动态数据源,可自行切换,默认数据源为达梦8

文章目录

    • 前言
    • 基础知识
      • 简介
      • 产品功能
    • 使用
      • 方案一
      • 方案二
      • 方案三
    • 注意点
      • 参考内容

基础知识

官网文档地址:https://shardingsphere.apache.org/document/current/cn/overview/

简介

  1. 开源的分布式数据库中间件解决方案组成的生态圈
  2. 关系型数据库中间件
  3. 产品组件
    • ShardingSphere-JDBC:轻量级Java框架,在Java的JDBC层提供额外服务
    • ShardingSphere-Proxy:透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持

产品功能

  1. 数据分片:分库、分表(垂直、水平)
  2. 分布式事务
  3. 读写分离
  4. 数据迁移
  5. 联邦查询:跨数据源查询
  6. 数据加密
  7. 影子库:压测数据隔离的影子数据库

使用

项目框架:若依前后端分离版本(SpringBoot 2.7.10)

ORM:Mybatis Plus(mybatis-plus-boot-starter 3.5.3)

数据库连接池:druid(druid-spring-boot-starter 1.2.15)

组件:ShardingSphere-JDBC(shardingsphere-jdbc-core-spring-boot-starter 5.2.0)

方案一

  1. 总pom引入shardingsphere-jdbc-core-spring-boot-starter

    <!-- 分库分表引擎 -->
    <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version>
    </dependency>
    
  2. framework模块引入shardingsphere-jdbc-core-spring-boot-starter

  3. admin模块新增配置文件application-shardingsphere.yml

    # 数据源配置
    spring:shardingsphere:# 单机模式mode:type: Standaloneprops:sql-show: true# 数据源配置datasource:names: druid,sharding# 主库数据源master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://localhost:5236?SCHEMA=xx&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=trueusername: SYSDBApassword: SYSDBA# 分库数据源	sharding:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://localhost:5236?SCHEMA=xxusername: SYSDBApassword: SYSDBA
    #        driver-class-name: com.mysql.jdbc.Driver
    #        url: jdbc:mysql://localhost:3306/ry-order1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    #        username: root
    #        password: root		# 标准分片配置rules:# 分片规则sharding:tables:# 表名tb_user:actual-data-nodes: sharding.tb_user_${0..1} # 相当于tb_user_0、tb_user_1table-strategy: # 分表策略standard: # 标准分表策略sharding-column: id                        # 分表列名sharding-algorithm-name: tb_user_inline    # 分表算法名字# 分片算法shardingAlgorithms:tb_user_inline:# 策略类型type: INLINEprops:algorithm-expression: tb_user_$->{id % 2} # 结果为0和1,与上面的表名对应
    
  4. 相应修改DruidProperties.java里的配置值

结果:没有数据分片的效果

方案二

在方案一的基础上

  1. DataSourceType加上类型SHARDING

  2. DruidConfig加上数据源

    setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingSphereDataSource");
    
  3. 调用方法上增加数据源类型

    @Override
    @DataSource(DataSourceType.SHARDING)
    public Long insertNew(User user) {return (long) userMapper.insert(user);
    }
    

注意点:shardingSphereDataSource默认使用的数据源名称就是sharding

结果:可以进行数据分片

方案三

  1. 总pom引入shardingsphere-jdbc-core-spring-boot-starter

    <!-- 分库分表引擎 -->
    <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version>
    </dependency>
    
  2. framework模块引入shardingsphere-jdbc-core-spring-boot-starter

  3. admin模块配置文件新增配置项指定sharding配置

    spring:shardingsphere:configLocation: application-sharding.yml
    
  4. 新增sharding配置文件application-sharding.yml,注意部分单词驼峰

    # 数据源
    dataSources:sharding:dataSourceClassName: com.alibaba.druid.pool.DruidDataSourcedriverClassName: dm.jdbc.driver.DmDriverurl: jdbc:dm://localhost:5236?SCHEMA=xxusername: SYSDBApassword: SYSDBAmaxTotal: 100
    #  ds_1:
    #    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    #    driverClassName: com.mysql.cj.jdbc.Driver
    #    url: jdbc:mysql://localhost:3306/ry-order2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    #    username: root
    #    password: root
    #    maxTotal: 100rules:- !TRANSACTIONdefaultType: LOCAL- !SHARDINGtables:# 表名tb_user:actualDataNodes: sharding.tb_user_$->{0..1}tableStrategy: # 分表策略standard: # 标准分表策略sharding-column: id                        # 分表列名sharding-algorithm-name: tb_user_inline    # 分表算法名字# 分片算法shardingAlgorithms:tb_user_inline:# 策略类型type: INLINEprops:algorithm-expression: tb_user_$->{id % 2}# 分布式序列算法配置(主键生成)keyGenerators:# 雪花算法snowflake:type: SNOWFLAKEprops:# 输出SQLsql-show: true
    
  5. 新增sharding配置类:ShardingProperties.java

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class ShardingProperties {@Value("${spring.shardingsphere.configLocation}")private String configLocation;public String getConfigLocation() {return configLocation;}
    }
    
  6. DataSourceType加上类型SHARDING

  7. DruidConfig加上数据源

    @Bean
    public DataSource shardingDataSource(ShardingProperties shardingProperties) throws Exception{ClassPathResource classPathResource = new ClassPathResource(shardingProperties.getConfigLocation());InputStream inputStream = classPathResource.getInputStream();File tmpFile = File.createTempFile(shardingProperties.getConfigLocation(), ".tmp");Files.copy(inputStream, tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(tmpFile);return dataSource;}// 动态数据源方法加上sharding
    @Bean(name = "dynamicDataSource")
    @Primary
    public DynamicDataSource dataSource(DataSource masterDataSource) {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingDataSource");return new DynamicDataSource(masterDataSource, targetDataSources);}
  8. 调用方法上增加数据源类型

结果:可以进行数据分片

注意点

  1. ShardingSphere各个版本有差异,并且不一定完全向前兼容,与其他框架如Springboot、druid上可能也存在某些版本无法兼容,所以需要注意引入的各个框架的版本

  2. 只有使用分片键进行操作才会通过分表扫描,否则依然是全表扫描

  3. 不支持分片表和单表关联查询

    1. 解决方案:重写sql,不走分片查询
  4. 分页:如果是一些非主流的数据库,不在支持的数据库类型里,则需要适配

    1. 解决方案一:使用支持的数据库方言类型,如MySQL

    2. 解决方案二:通过自定义分页SQL实现

      SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT id, company_code, FROM table_name ) TMP WHERE ROWNUM <=?) WHERE ROW_ID > ?   
      
  5. 无法更新:IService.updateById()

    1. 不能更新分片键字段,因为可能存在更新完不在此分片表里
    2. 实体表字段加注解不更新:@TableField(updateStrategy = FieldStrategy.NEVER)
  6. 表约束失效:唯一性约束在多个表失效

  7. 使用in条件,即使使用分片键,还是会走全路由

参考内容

  1. 自定义分片算法:参考1、参考2、参考3

http://www.ppmy.cn/news/554874.html

相关文章

海尔商用空调20HP焓差冷水测试系统

Haier 20HP焓差冷水测试系统 1 简述 本测试室利用空气焓差法测定空调机组的制冷、制热量、名义工况下功率消耗、能效比&#xff08;EER值&#xff09;、运行电流、室内风量是较常用的&#xff0c;亦为标准所认可的一种方法。这种方法满足国标GB/T7725-1996“房间空气调节器…

海尔云谷创新中心A座能耗监测系统的应用

李婧婧 安科瑞电气股份有限公司 13651946738 摘要&#xff1a;公共建筑是节能大户和节能重点&#xff0c;做好公共建筑节能工作&#xff0c;对促进和带动全社会节能工作&#xff0c;实现节能减排目标&#xff0c;落实“转方式、调结构”重大战略具有重要意义。本文介绍海尔…

Spark7-9

7. Spark中的一些重要概念 7.1 Application 使用SparkSubmit提交的个计算应用&#xff0c;一个Application中可以触发多次Action&#xff0c;触发一次Action产生一个Job&#xff0c;一个Application中可以有一到多个Job 7.2 Job Driver向Executor提交的作业&#xff0c;触发…

如果你曾经拥有python,那么现在你应该拥抱Julia吗?

看完本文&#xff0c;您就会有较成熟的想法。 Julia和Python的区别是什么&#xff1f;为什么Julia适合用于大规模计算和超级计算机模拟&#xff1f; 你一定听说过Julia和Python这两个编程语言。虽然它们都可以用于从简单的机器学习应用程序到巨大的超级计算机模拟的所有方面&am…

C#利用PrintDocument定制打印单据

C#利用PrintDocument定制打印单据 https://www.cnblogs.com/hsiang/p/6921817.html

css写打印单据样式

最近有一个需求要写打印单据的样式 记得在上上家公司也同样写过类似需求&#xff0c;当时用的px效果还凑合吧&#xff0c;记得是要用行内样式&#xff0c;否则不生效 这次是直接公司有写了模板&#xff0c;新增模板&#xff0c;看到用的是mm单位&#xff08;毫米&#xff09;…

真的不能错过的打印攻略!打印一张7分钱

在打印资料时&#xff0c;为节省打印的费用&#xff0c;很多人会寻求一些打印的攻略&#xff0c;找到打印的攻略可以大大的为大家节省不少打印的费用。很多人看来&#xff0c;打印资料1毛钱一张算便宜的价格了&#xff0c;殊不知还有更便宜的&#xff0c;在易桌面打印室打印资料…

排序算法之堆排序_20230624

排序算法之堆排序 前言 堆排序是基于比较排序的一类算法&#xff0c;算法重复利用堆(Binary heap)的特性&#xff0c;最大&#xff08;最小&#xff09;元素一定位于堆顶的位置&#xff0c;那么就可以提取堆顶元素&#xff0c;放置在数组的尾部位置&#xff0c;后再把剩余的元…