ShardingSphere-JDBC-若依框架集成

这篇具有很好参考价值的文章主要介绍了ShardingSphere-JDBC-若依框架集成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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: Standalone
        props:
          sql-show: true
        # 数据源配置
        datasource:
          names: druid,sharding
          # 主库数据源
          master:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: dm.jdbc.driver.DmDriver
            url: jdbc:dm://localhost:5236?SCHEMA=xx&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true
            username: SYSDBA
            password: SYSDBA
    	  # 分库数据源	
          sharding:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: dm.jdbc.driver.DmDriver
            url: jdbc:dm://localhost:5236?SCHEMA=xx
            username: SYSDBA
            password: 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_1
                table-strategy: # 分表策略
                  standard: # 标准分表策略
                    sharding-column: id                        # 分表列名
                    sharding-algorithm-name: tb_user_inline    # 分表算法名字
    		# 分片算法
            shardingAlgorithms:
              tb_user_inline:
    			# 策略类型
                type: INLINE
                props:
                  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.DruidDataSource
        driverClassName: dm.jdbc.driver.DmDriver
        url: jdbc:dm://localhost:5236?SCHEMA=xx
        username: SYSDBA
        password: SYSDBA
        maxTotal: 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: 100
    
    rules:
      - !TRANSACTION
        defaultType: LOCAL
      - !SHARDING
        tables:
          # 表名
          tb_user:
            actualDataNodes: sharding.tb_user_$->{0..1}
            tableStrategy: # 分表策略
              standard: # 标准分表策略
                sharding-column: id                        # 分表列名
                sharding-algorithm-name: tb_user_inline    # 分表算法名字
        # 分片算法
        shardingAlgorithms:
          tb_user_inline:
    		# 策略类型
            type: INLINE
              props:
              algorithm-expression: tb_user_$->{id % 2}
    	
    	# 分布式序列算法配置(主键生成)
        keyGenerators:
          # 雪花算法
          snowflake:
            type: SNOWFLAKE
    
    props:
      # 输出SQL
      sql-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条件,即使使用分片键,还是会走全路由文章来源地址https://www.toymoban.com/news/detail-486721.html

参考内容

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

到了这里,关于ShardingSphere-JDBC-若依框架集成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java微服务分布式分库分表ShardingSphere - ShardingSphere-JDBC

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月26日
    浏览(47)
  • 分表?分库?分库分表?实践详谈 ShardingSphere-JDBC

    如果有不是很了解ShardingSphere的可以先看一下这个文章: 《ShardingSphere JDBC?Sharding JDBC?》基本小白脱坑问题         在很多开发场景下面,很多的技术难题都是出自于,大数据量级或者并发的场景下面的。这里就出现了我们要解决的。本文章重点讨论一下在java的spirng开发场

    2024年04月12日
    浏览(37)
  • SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。

    👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 Docker部署MYSQL主从详细教程-阿木木AEcru-CSDN 那天写了 部署mysql主从后,想了想,还是有必要出多一篇关于ShardingSphere-JDBC 读写分离

    2024年04月13日
    浏览(38)
  • 若依框架集成sharding-jdbc

    本文基于4.X版本开发 官方网站 定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spri

    2024年02月08日
    浏览(94)
  • 若依框架集成WebSocket

            WebSocket 是一种在单个TCP连接上进行全双工通信的协议。         WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并

    2024年02月08日
    浏览(44)
  • 若依框架集成WebSeockt方法

    第一步:在ruoyi-framework模块的pom.xml里添加websocket的jar包 第二步:在framework包下新建websocket包,添加一下4个文件 1、WebSocketConfig 2、WebSocketServer 3、SemaphoreUtils 4、WebSocketUsers 第三步:很关键,给websocket允许通过的权限,修改SecurityConfig文件的configure方法添加如下: 第四步:前端

    2023年04月22日
    浏览(25)
  • 若依框架集成WebSocket带用户信息认证

          我们平时前后台请求用的最多的就是 HTTP/1.1 协议,它有一个缺陷, 通信只能由客户端发起,如果想要不断获取服务器信息就要不断轮询发出请求,那么如果我们需要服务器状态变化的时候能够主动通知客户端就需要用到WebSocket了, WebSocket是一种网络传输协议,同样也

    2024年02月07日
    浏览(48)
  • 0103水平分片-jdbc-shardingsphere-中间件

    随着系统业务的发展,t_order表数据快速增长,服务器压力增大,影响系统性能,我需要对server-order进行分库分表。 服务器规划: 服务器:容器名 server-order0 ,端口号3310 服务器:容器名 server-order1 ,端口号3311 1.1 创建server-order0容器 step1:创建挂载文件夹 Step2:创建容器 st

    2024年02月11日
    浏览(45)
  • 0101读写分离测试-jdbc-shardingsphere-中间件

    shardingshpere-jdbc定位为轻量级 Java 框架, 在 Java 的 JDBC 层提供的额外服务 。 它使用客户端直连数据库, 以 jar 包形式提供服务 ,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。 关于mysql配置主从复制,可以参考之前写的文章= 0101docker mysq

    2024年02月11日
    浏览(46)
  • springboot~shardingsphere在非spring框架中的使用

    shardingsphere已经很方便的被springboot集成了,你只要引入 sharding-jdbc-spring-boot-starter 这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。 添加了数据源,确定了mysql数据库,

    2024年01月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包