【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):数据分片

SpringBoot整合ShardingSphere-JDBC 5.3.2 实现读写分离、分库分表。 SpringBoot 整合 shardingSphere-Jdbc 5.3.2 实现分库分表,读写分离 。 讲述了 分库分表、读写分离的 实现原理以及运用场景。 阅读详情

一、Sharding Sphere基本介绍

官网链接推荐:跳转官网 | 5.0.0中文文档 | 数据分片介绍

二、Spring Boot整合Sharding Sphere Jdbc

1、数据库准备

cyun_log_0数据库

CREATE DATABASE `cyun_log_0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE `cyun_log_0`;

DROP TABLE IF EXISTS `t_sys_log`;
CREATE TABLE `t_sys_log`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

DROP TABLE IF EXISTS `t_sys_log_2022_04`;
CREATE TABLE `t_sys_log_2022_04`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

DROP TABLE IF EXISTS `t_sys_log_2022_05`;
CREATE TABLE `t_sys_log_2022_05`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

cyun_log_1数据库

CREATE DATABASE `cyun_log_1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE `cyun_log_1`;

DROP TABLE IF EXISTS `t_sys_log`;
CREATE TABLE `t_sys_log`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

DROP TABLE IF EXISTS `t_sys_log_2022_04`;
CREATE TABLE `t_sys_log_2022_04`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

DROP TABLE IF EXISTS `t_sys_log_2022_05`;
CREATE TABLE `t_sys_log_2022_05`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

注意:使用Mybatis自动生成映射文件,只需要生成t_sys_log的即可,下文配置的就是t_sys_log

2、pom依赖

		<!--sharding-jdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.0.0</version>
        </dependency>

3、application.yml配置


# ShardingSphere 使用本地数据源
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      # 数据源
      names: db0,db1
      # 日志类型:未知、操作日志
      db0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:7000/cyun_log_0?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.zaxxer.hikari.HikariDataSource
      # 日志类型:登录日志、定时任务日志
      db1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:7000/cyun_log_1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.zaxxer.hikari.HikariDataSource
    # 使用模式,支持三种模式:内存模式、单机模式、集群模式
    mode:
      type: Memory
    props:
      # 打印sql
      sql-show: true
    # 规则
    rules:
      sharding:
        # 算法
        sharding-algorithms:
          t-log-type-inline:
            props:
              # 表达式
              algorithm-expression: db$->{log_type % 2}
            # 行表达式
            type: inline
          sys-log-date-algorithms:
            # 自定义算法
            type: sysLogDateAlgorithm
        # 表格配置
        tables:
          # 此配置为自己编写sql时所使用的表
          t_sys_log:
            actual-data-nodes: db${[0,1]}.t_sys_log,db${[0,1]}.t_sys_log_2022_0${4..5}
            # 数据库策略
            database-strategy:
              standard:
                sharding-algorithm-name: t-log-type-inline
                sharding-column: log_type
            # 表策略
            table-strategy:
              standard:
                # 自定义算法
                sharding-algorithm-name: sys-log-date-algorithms
                sharding-column: create_time

4、自定义日期算法

创建类SysLogDateAlgorithm实现StandardShardingAlgorithm接口

package com.cyun.log.config.algorithm;

import com.google.common.collect.Range;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

/**
 * 自定义按月分表算法
 *
 * @author Panfu.he
 */
@Slf4j
@Component
public class SysLogDateAlgorithm implements StandardShardingAlgorithm<Date> {

    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM");

    /**
     * 精准分片
     *
     * @param availableTargetNames 表信息
     * @param preciseShardingValue 字段内容信息
     * @return
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> preciseShardingValue) {
        final String yearMonth = sdf.format(preciseShardingValue.getValue());
        // 找到对应得表格
        for (String tableName : availableTargetNames) {
            if (tableName.endsWith(yearMonth)) {
                log.info("############### (sharding-jdbc分表)最终匹配表名:{} ###############", tableName);
                return tableName;
            }
        }
        return (String) availableTargetNames.toArray()[0];
    }

    /**
     * 范围分片
     *
     * @param availableTargetNames 表信息
     * @param rangeShardingValue   字段内容信息
     * @return
     */
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> rangeShardingValue) {
        final Range<Date> valueRange = rangeShardingValue.getValueRange();
        final String yearMonth1 = sdf.format(valueRange.lowerEndpoint());
        final String yearMonth2 = sdf.format(valueRange.upperEndpoint());

        // 找到对应得表格
        Set<String> tableNames = new TreeSet<>();
        for (String tableName : availableTargetNames) {
            if (tableName.endsWith(yearMonth1) || tableName.endsWith(yearMonth2)) {
                log.info("############### (sharding-jdbc分表)最终匹配表名:{} ###############", tableName);
                tableNames.add(tableName);
            }
        }
        return tableNames;
    }

    @Override
    public void init() {

    }

    @Override
    public String getType() {
        return "sysLogDateAlgorithm";
    }
}

配置SPI:在资源目录下创建META-INF.services目录 -> 创建文件org.apache.shardingsphere.sharding.spi.ShardingAlgorithm。在文件类配置SysLogDateAlgorithm
在这里插入图片描述
在这里插入图片描述

5、展示

在这里插入图片描述

三、Spring Boot整合Sharding Sphere Jdbc支持未分表的数据源(多数据源配置)

1、新增pom依赖

		<!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>

        <!-- 动态数据源 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.2.1</version>
        </dependency>

2、application.yml配置,需注意Sharding Sphere Jdbc单数据源配置数据库地址使用的是jdbc-url,而多数据直接使用url


spring:
  datasource:
    # 可以先在这里配置好通用的配置,比如
    druid:
      initial-size: 10
      max-active: 100
      min-idle: 3
      max-wait: 5000
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 100
    #dynamic开始多数据源配置
    dynamic:
      datasource:
        master:  # 数据源的名字:master
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:7000/cyun_log?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      primary: master
  shardingsphere:
    datasource:
      # 数据源
      names: db0,db1
      # 日志类型:未知、操作日志
      db0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:7000/cyun_log_0?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
      # 日志类型:登录日志、定时任务日志
      db1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:7000/cyun_log_1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
    # 使用模式,支持三种模式:内存模式、单机模式、集群模式
    mode:
      type: Memory
    props:
      # 打印sql
      sql-show: true
    # 规则
    rules:
      sharding:
        # 算法
        sharding-algorithms:
          t-log-type-inline:
            props:
              # 表达式
              algorithm-expression: db$->{log_type % 2}
            # 行表达式
            type: inline
          sys-log-date-algorithms:
            # 自定义算法
            type: sysLogDateAlgorithm
        # 表格配置
        tables:
          # 此配置为自己编写sql时所使用的表
          t_sys_log:
            actual-data-nodes: db${[0,1]}.t_sys_log,db${[0,1]}.t_sys_log_2022_0${4..5}
            # 数据库策略
            database-strategy:
              standard:
                sharding-algorithm-name: t-log-type-inline
                sharding-column: log_type
            # 表策略
            table-strategy:
              standard:
                sharding-algorithm-name: sys-log-date-algorithms
                sharding-column: create_time

3、动态数据源配置

package com.cyun.log.config;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.driver.jdbc.adapter.AbstractDataSourceAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;


/**
 * 动态数据源配置:
 * 使用{@link com.baomidou.dynamic.datasource.annotation.DS}注解,切换数据源
 *
 * @author He PanFu
 * @date 2022-04-14 16:45:26
 */
@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})
public class DataSourceConfiguration {

    /**
     * 分表数据源名称
     */
    private static final String SHARDING_DATA_SOURCE_NAME = "sharding_sphere";
    /**
     * 动态数据源配置项
     */
    @Resource
    private DynamicDataSourceProperties properties;

    /**
     * Sharding Sphere Jdbc有四种数据源,需要根据业务注入不同的数据源
     * <p>
     * 1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
     * 2. 主从数据源: masterSlaveDataSource;
     * 3. 脱敏数据源:encryptDataSource;
     * 4. 影子数据源:shadowDataSource
     */
    @Lazy
    @Resource
    AbstractDataSourceAdapter shardingDataSource;

    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                // 将 Sharding Sphere Jdbc 管理的数据源也交给动态数据源管理
                dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
                return dataSourceMap;
            }
        };
    }

    /**
     * 将动态数据源设置为首选的
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持Sharding Sphere Jdbc原生的配置方式了
     *
     * @return 数据源
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }
}

4、使用@DS切换数据源,默认使用master

在这里插入图片描述

四、拓展:相关文章推荐

sharding-jdbc 分库分表的 4种分片策略
shardingsphere+dynamic+mybatisPlugs配置多数据源

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验) 最近线上的项目部分数据表增量速度比较快,可以预见的是,个把月后数据量会急剧增长至千万级,所以只是简单的使用索引等已经无法满足业务需求了,分库分表势在必行!于是着手研究如何整合ShardingSphere到现有项目中,顺带记录一下实验过程吧。特别声明:这边是实验配置阶段,还没有完成整合到项目、以及测试联调阶段,所以不敢保证实验过程是否正确。而且,在我的业务中,还涉及到【普通单表】与【分片表】之间的联表查询,所以需要后期比较严谨的测试才能知道最终效果。不过我自己对比了站内其他大佬的教程,大体是没问题的。 阅读详情

相关推荐

spring boot整合sharding-sphere实现分库分表

首先,为什么使用sharding-JDBC,看这个 https://blog.csdn.net/qq_42046105/article/details/87944673 支撑日活百万用户的高并发系统,应该如何设计其数据库架构?【石杉的架构笔记】 理一下关系,sharding-jdbc和sharding-sphere什么区别?看这个 https://blog.csdn.net/...

m0_38138534的博客 615

Spring Boot集成ShardingSphere详解

Apache ShardingSphere是一套开源的分布式数据库中间件解决方案,由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)三款相互独立但可混合部署的产品组成。ShardingSphere旨在充分利用关系型数据库的计算和存储能力,在分布式场景下提供标准化的数据分片、分布式事务和数据库治理功能。:作为JDBC驱动的增强版,在客户端完成数据库分库分表相关的路由和操作,以jar包形式提供服务,无需额外部署和依赖。

德乐懿的博客 6089

sharding-sphere实现JDBC的读写分割

Sharding-sphere实现JDBC的读写分割 准备:在linux上准备两台虚拟机,配置Mysql,与Mysql的主从复制并在Mysql上新建对应的连接。 Mysql主从复制的详解 注:在Mysql上新建对应的连接时要关闭防火墙,并开启Mysql的远程连接 #查询防火墙状态 firewall-cmd --state #关闭防火墙 systemctl stop firewalld.servic...

weixin_44299526的博客 344

springboot+shardingsphere温故而知新

前面也分析过springboot集成shardingsphere组件实现分库分表。分库分表主要解决海量数据引起的IO问题、查询慢等问题。 ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能。 1、ShardingSphere-JDBC:定位为轻量级 Java 框架,在 Java 的 JDBC 层提供额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额

ldcaws的专栏 4107

spring boot使用经验分享(二)集成sharding-sphere实现分表

MySQL拥有体积小、速度快、成本低、开源等多种优点,而且随着今年的发展mysql性能也有了一定的提升,越来越多的公司在选择数据库的时候,选择使用MySQL。 但是当MySQL中单表数据量达到千万级别的时候,就需要考虑一个问题-分库分表。 网上有各种各样的开源框架,但是其中最为常见的就是sharding-sphere。 一、什么是ShardingSphere? ShardingSphere...

1861

Spring Boot集成ShardingSphere实现读写分离 | Spring Cloud 43

通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力。 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升系统的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。 与将数据根据分片键打散至各个数据节点的水平分片不同,读写分离则是根据 SQL 语义的分析,将读操作和写操作分别路由至主库与从库。

gmHappy 1万+

Spring Boot中整合Sharding-JDBC单库分表示例

本文是Sharding-JDBC采用Spring Boot Starter方式配置第二篇,第一篇是读写分离讲解,请参考:《Spring Boot中整合Sharding-JDBC读写分离示例》 在我《Spring Cloud微服务-全栈技术与案例解析》书中都是通过XML方式配置。今天给大家演示的是单库中分表的操作,如果用XML方式配置,那么就是下面的配置: &amp;lt;!-- 数据源 --&amp;...

u010889990的专栏 6264

基于plc的工厂除尘控制系统设计(S7-200、仿真、调试、高质量)

工业作为我国第二支柱产业,在近十几年来发展非常迅速,虽然带了了可观的经济效益,但在工业生产中所产生的大量粉尘气体对大气的污染现象也不容忽视。为减少工业粉尘对环境的污染,世界各国制定了严格的环境保护要求。为了减少工业中粉尘的排放,除尘器的研发改良,以及燃煤的使用等等都在不断更改以符合粉尘排放标准。而目前最先进的除尘设备无机膜除尘器具备除尘效率高,稳定性好,结构紧凑易于维护等优点,且无机膜对于粉尘吸附效率高,抗腐蚀能力优秀,耐高温,因此能更有效应用于高温烟气的除尘。本文根据PLC技术在除尘方面的应用,来优化设计

老高的博客 1279

默默学Sharding-Sphere(三)

接上篇,使用文档。 使用文档 数据分片 不使用Spring 引入Maven依赖 &lt;dependency&gt; &lt;groupId&gt;io.shardingsphere&lt;/groupId&gt; &lt;artifactId&gt;sharding-jdbc-core&lt;/artifactId&gt; &lt;version&gt;${shardin...

默默草 1万+

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7161

从理论到实践:利用FilterSolutions高效设计7阶椭圆低通滤波器

本文详细介绍了如何利用FilterSolutions软件高效设计7阶椭圆低通滤波器。文章从理论入手,对比了巴特沃斯、切比雪夫等经典滤波器特性,阐述了在要求高衰减陡度(如62dB抑制)和严格通带波纹(0.2dB)时,椭圆滤波器是最优选择。通过分步实战教程,指导读者完成从软件参数设置、性能验证到实际电路布局与调试的全过程,助力射频与高速数字信号处理工程师将理论转化为可靠设计。

jupi8的博客 559

【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):数据加密

一、Sharding Sphere基本介绍 官网链接推荐:跳转官网 | 5.0.0中文文档 | 数据加密介绍 二、环境准备 -- auto-generated definition create table t_user ( user_id varchar(32) not null comment '用户id' primary key, user_name varchar(255) null comment '用户名称', pas

apple_csdn的博客 1550

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用 最近在Pattern Recognition投出了一个文章,纯纯属于是第一次投稿,感觉自己写了一坨屎,事实是这确实也是一坨屎,现在是投了之后在等待一个拒稿的状态。 但是还是记录一下一些流程 1. 下载模板 在出版商Elsevier的栏目里有对于稿件的结构要求,也提供了Latex模板。同时,也给作者提供了Guides, 可以仔细阅读。下面这个连接咱们可以下载到Guides以及看到一些文章的要求。 https://ww

weixin_44153180的博客 3万+

Spring Boot使用sharding-sphere 配置分库,读写分离。

使用的是分库分表利器——sharding-sphere 本次配置的为一主两从的分库配置,所以需要先准备三个库。 pom.xml配置 引入sharding-sphere: <!-- shardingsphere --> <dependency> <groupId>io.shardingsphere</groupId> ...

Aaron 925

分辨率太小 / Retina 模糊 / 全屏异常:一篇解决 VMware Fusion + Kali 显示问题(Xfce & GNOME 通用)

本文提供了在Mac(尤其是Retina屏)上运行Kali Linux时常见显示问题的完整解决方案。主要解决三类问题:分辨率太小、Retina屏模糊和全屏异常。核心思路是先安装open-vm-tools-desktop并重启,这是90%问题的根源。然后根据不同问题分别处理:调整DPI/Scale解决字体大小,避免双重缩放导致的模糊,以及通过窗口拉伸和重启解决全屏异常。文章还给出了针对Xfce和GNOME的最佳配置建议,并强调调试完成后应创建快照以便快速恢复。最后提供了速查表,方便用户快速参考关键步骤。

致力于分享在各类技术领域的学习与实践经验,涵盖编程、虚拟化、开源工具、网络安全等。 874

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 808

【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):影子库压测

一、Sharding Sphere基本介绍 官网链接推荐:跳转官网 | 5.0.0中文文档 | 影子库压测介绍 二、环境准备 1、数据库准备 cyun_log_0数据库 CREATE DATABASE `cyun_log_0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE `cyun_log_0`; DROP TABLE IF EXISTS `t_sys_log`; CREATE TABLE `t_sys_log` (

apple_csdn的博客 1616

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 581

Sharding-Sphere学习专题(二)案例和分片策略

就算是有一些数据根本和数据库的数据差得不是一点半点,根本就没必要分片去查浪费性能所以我们需要定制# 使用CLASS_BASED分片算法- 不用配置SPI扩展文件# 指定策略 STANDARD|COMPLEX|HINT# 指定算法实现类。这个类必须是指定的策略对应的算法接口的实现类。//保留配置的分片键。在当前算法中其实是没有用的。@Override/*** 实现自定义分片算法* @param availableTargetNames 在actual-nodes中配置了的所有数据分片。

2303_80933038的博客 1316

通过 MATLAB/Simulink + Simscape Battery,构建了锂电池老化模型与容量衰减仿真系统

本文基于MATLAB/Simulink平台,构建锂电池老化模型与容量衰减仿真系统,研究储能电池健康管理技术。通过搭建电化学-老化耦合模型,模拟循环和日历老化机制,分析温度、充放电倍率、DOD等因素对电池寿命的影响。系统实现了SOH在线估计和RUL预测功能,仿真了标准日历老化、高倍率循环和峰谷套利等典型工况下的电池衰减行为。结果表明:高温和深充放会显著加速电池老化,而精准的SOH管理可提升储能系统经济性30%以上。文章还探讨了数字孪生、机器学习等高级优化方向,为储能系统长周期运营提供技术支撑。

xiaoheshang_123的博客 398

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):读写分离

一、Sharding Sphere基本介绍 官网链接推荐:跳转官网 | 5.0.0中文文档 | 读写分离介绍 二、一主一从Docker环境搭建

apple_csdn的博客 1757

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

分布式数据库中间件--> sharding-sphere3.x 从概念到代码实现详解

本文重点讲解sharding-phere是什么?能做什么?怎么用三大经典问题。 1.Sharding-Sphere 是什么? Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。 Sharding-Sphere...

CUITAO2305532402的博客 580

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度剖析分库分表最强辅助Sharding Sphere

Sharding-SphereSharding-JDBC最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已...

艾小仙的专栏 1009

java分库框架shard_Spring Boot 2.0 分库分表框架Sharding-Sphere 3.x 入门

一年多之前我做一个项目的时候,需要分库分表,然后我就在网上搜索这方面的开源软件,遇见了Sharding-JDBC,当时是1.x版本,我发现用它来做分库分表比较容易上手。最近发现它已经是到3.x版本了,而且名字也改了,改为Sharding-Sphere。最近我使用了最新的版本做了一个例子。我使用的不是自己生产环境的例子,而是官网的例子,只是是在Spring Boot 2.0上做的,配置和官网给出的例...

weixin_42465846的博客 610

Sharding Sphere ~ Sharding-jdbc分库分表、读写分离

Sharding Sphere 是什么? 1、一套开源的分布式数据库中间件解决方案 2、有三个产品:Sharding-JDBC 和 Sharding-Proxy 3、定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库操作 如何学习? 官网: http://shardingsphere.apache.org/ 版本: 4.0 官方文档对每个产品的描述非常详细,建议大家都去看看。 这里我选择的版本是4.0版本 ...

xiaozhegaa的博客 718

Mysql中间件系列Sharding-Sphere 之 Sharding-JDBC 快速入门

最近需要重构下公司SaaS系统的分库分表的中间件, 发现2020年刚孵化完毕的Sharding-Sphere还是不错的, 故有了此文. 话不多说直接干货, 直接一个分库分表小demo献上! 首先, 这个小demo做了什么事说明下: 提供course课程的crud 利用course的id进行 水平分表 利用course所属的userId 进行水平分库 Demo很简单, 结构如下: 首先, maven依赖, 版本其实无所谓, 现在的兼容性比之前强了很多, 主要是要将shardingsphere支持引入,

李昊轩的博客 1027
上一篇: 【RabbitMQ、Spring Boot】Spring Boot整合RabbitMQ实现并发和限流
下一篇: 【Docker、Mysql】Docker搭建Mysql主从复制(一主一从)
apple_csdn
博客等级 码龄8年 157粉丝 83原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值