基于ShardingSphere分库分表

ShardingSphere(八) 分库分表的多种分片策略 在之前文章《ShardingSphere(二) 水平分表配置搭建,实现分表写入读取》中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业务场景单一的行表达式不能满足。Sharding jdbc为我们实际提供了5种的分库分表策略实现方式。如下: 标准分片策略 (PreciseShardingAlgorithm、RangeShardingAlgorithm) 复合分片策略 (ComplexKeysShardingAlgorithm) Hint分片策略 . 阅读详情

分库分表

分库分表包括分库和分表两个维度,每个维度都可以采用两种拆分思路,即:垂直拆分和水平拆分。

垂直拆分

垂直分表

垂直分表指的是将一个表按照字段分成多张表,每个表存储其中一部分字段。

如图所示: 

实现上,通常可以把大字段数据或热度较低的数据放在一张独立的表中,将经常需要组合查询的列放在一张表中,这也可以认为是分表操作的一种表现形式。

通过垂直分表能得到一定程度的性能提升,但数据毕竟仍然位于同一个数据库中,也就是把操作范围限制在一台服务器上,每个表还是会竞争同一台服务器中的CPU、内存、网络IO等资源。为此,在垂直分表后,可以进一步引入垂直分库。

垂直分库

垂直分表后,用户信息与商品、订单等信息仍然在同一台服务器中。基于垂直分库思想,可以将用户相关的数据表单独拆分出来,存放到一个独立的数据库中。

如图所示:

垂直分库指的是按照业务对数据表进行分类,将不同业务的数据表分布到不同的数据库中,每个数据库可以位于不同的服务器上,其核心理念是专库专用。垂直分库很大程度上取决于业务的规划和系统边界的划分。如:独立拆分用户数据需要考虑到系统用户体系与其他业务模块之间的关联关系,而不是简单地创建一个用户库。在高并发场景下,垂直分库能够在一定程度上提升IO访问效率和数据库连接数,并降低单机硬件资源的瓶颈。

水平拆分

水平分库

垂直拆分尽管实现起来比较简单,但并不能解决单表数据量过大的问题。因此,往往需要在垂直拆分的基础上再进行水平拆分。如:可以对用户库中的用户信息按照用户ID进行取模,将用户数据分别存储在不同的数据库中,即:水平分库。

如图所示:

水平分库指的是将数据表中的数据按一定规则拆分到不同的数据库中,每个数据库可以位于不同的服务器上。这种方案能够解决单库存储量及性能瓶颈问题,但由于同一个表被分配在不同的数据库中,数据的访问需要额外的路由工作,因此大大提升了系统复杂度。

水平分库拆分规则实际上是一系列算法,常见的拆分规则有:

  • 取模算法。如:按照用户ID进行取模、通过表的一列或多列字段进行hash求值来取模。
  • 范围限定算法。如:可以采用按年份、按时间等策略路由到目标数据库或表。
  • 预定义算法。如:事先规划好具体库或表的数量,然后直接路由到指定库或表中。

水平分表

按照水平分库的思路,还可以对用户库中的用户表进行水平拆分。水平分表指的是在同一个数据库内,将同一个表中的数据按一定规则拆到多个表中。

如图所示:

分库分表方案

分库分表可以抽象成一个核心概念:分片(Sharding)。无论是分库还是分表都是将数据划分为不同的数据分片,存储到不同的目标对象中。具体的分片方式涉及实现分库分表的不同解决方案。

常见的数据分片方案有三大类型:客户端分片、代理服务器分片、分布式数据库。

客户端分片

客户端分片指的是在数据库的客户端实现分片规则。这种方式将分片处理逻辑进行前置,客户端管理和维护着所有的分片逻辑,并决定每次SQL执行所对应的目标数据库和数据表。

客户端分片主要有应用层分片和重写JDBC协议两种表现形式。

应用层分片

应用层分片指的是在应用程序中直接维护着分片规则和分片逻辑。

如图所示:

在具体实现上,应用层分片通常会将分片规则的处理逻辑打包成一个公共JAR包,业务开发人员只需要在代码工程中引入该JAR包。这种方案由于没有独立的服务器组件,因此不需要专门维护某一个具体的中间件。这种直接在业务代码中嵌入分片组件的方案存在明显缺陷:

  • 由于分片逻辑嵌入到业务代码中,业务开发人员在理解业务的基础上还需要掌握分片规则的处理方式,增加了开发和维护成本。
  • 使用该方案一旦出现问题,只能依赖业务开发人员通过分析代码来查找原因,无法将这部分工作抽离出来由专门的中间件团队完成。
重写JDBC协议

重写JDBC协议指的是将分片规则从业务代码中剥离出来,嵌入到JDBC协议中。这样业务开发人员就可以使用与JDBC规范完全兼容的一套API来操作数据库,从而实现对业务代码的零侵入。

如图所示:

重写JDBC协议方案的分片操作对业务而言完全透明,在一定程度上实现了业务开发人员与数据库中间件团队在职责上的分离。业务开发人员只需要理解JDBC规范就可以完成分库分表,降低了开发难度和代码维护成本。

典型的客户端分片中间件有:阿里巴巴的TDDL、ShardingSphere。

代理服务器分片

代理服务器分片方案是采用代理机制,在应用层和数据库层之间添加一个代理层,将分片规则集中维护在该代理层中,并对外提供与JDBC兼容的API。应用层的业务开发人员无需关心具体的分片规则,只需要完成业务逻辑的实现即可。

如图所示:

代理服务器分片的优点是业务开发人员无需维护分片规则,只需专注于业务逻辑实现;缺点是在应用和数据库之间添加了一层代理,会对网络传输性能产生一定的影响。

典型的代理服务器分片中间件有:阿里巴巴的Cobar、开源MyCat。

分布式数据库

在技术发展和演进的过程中,关系型数据库的一大问题是缺乏分布式环境下面对大数据量、高并发访问的有效数据处理机制。如:事务是关系型数据库的基本特征之一,但在分布式环境下,如果想要基于MySQL等传统关系型数据库来实现事务将面临巨大的挑战。

以TiDB为代表的分布式数据库赋予了关系型数据库一定程度的分布式特性。在这些分布式数据库中,数据分片及分布式事务将是其内置的基础功能,对业务开发人员完全透明。业务开发人员只需要使用框架对外提供的JDBC接口,就像在使用MySQL等传统关系型数据库一样。

基于ShardingSphere分库分表示例

添加依赖:

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>
<!-- mybatis-plus-generator -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>
<!-- druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>
<!-- sharding-jdbc -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

添加注解:

@MapperScan("com.sharding.mapper")

添加配置:

server:
  port: 8080
spring:
  application:
    name: shardingsphere
  main:
    allow-bean-definition-overriding: true
  # 设置数据源
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/ds0?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
        username: xxxx
        password: xxxxxxxx
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/ds1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
        username: xxxx
        password: xxxxxxxx
    # 设置分片策略
    sharding:
      # 设置默认数据库
      default-data-source-name: ds0
      # 设置分库策略
      default-database-strategy:
        inline:
          # 分片列名
          sharding-column: user_id
          # 分片行表达式
          algorithm-expression: ds$->{user_id % 2}
      # 绑定表
      binding-tables: t_health_record,t_health_task
      # 广播表
      broadcast-tables: t_health_level
      tables:
        t_health_record:
          # 数据节点
          actual-data-nodes: ds$->{0..1}.t_health_record$->{0..1}
          # 设置分表策略
          table-strategy:
            inline:
              sharding-column: record_id
              algorithm-expression: t_health_record$->{record_id % 2}
          # 设置主键id生成策略
          key-generator:
            column: record_id
            type: SNOWFLAKE
        t_health_task:
          actual-data-nodes: ds$->{0..1}.t_health_task$->{0..1}
          table-strategy:
            inline:
              sharding-column: record_id
              algorithm-expression: t_health_task$->{record_id % 2}
          key-generator:
            column: task_id
            type: SNOWFLAKE
    props:
      sql:
        show: true
# mybatis-plus
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.sharding.entity

ShardingSphere雪花算法生成分布式ID:

  • 1)数据库表结构,主键的类型为bigint。
  • 2)主键不要设置自增。
  • 3)对应的实体类主键类型设置为Long对象,而不是long。

数据库表:

-- 创建用户信息表
drop table if exists t_user;
create table t_user
(
    user_id         bigint comment '用户ID',
    user_name       varchar(100)    null comment '用户名'
) engine = Innodb default charset = utf8mb4 comment '用户信息表' ;
create index idx_user_user_name on t_user (user_name);

-- 创建健康记录表
drop table if exists t_health_record;
create table t_health_record
(
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    level_id        bigint comment '健康等级ID',
    remark          varchar(100)    null comment '描述信息'
) engine = Innodb default charset = utf8mb4 comment '健康记录表';
create index idx_health_record_user_level on t_health_record (user_id,level_id);

-- 创建健康记录表
drop table if exists t_health_record0;
create table t_health_record0
(
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    level_id        bigint comment '健康等级ID',
    remark          varchar(100)    null comment '描述信息'
) engine = Innodb default charset = utf8mb4 comment '健康记录表0';

-- 创建健康记录表
drop table if exists t_health_record1;
create table t_health_record1
(
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    level_id        bigint comment '健康等级ID',
    remark          varchar(100)    null comment '描述信息'
) engine = Innodb default charset = utf8mb4 comment '健康记录表1';

-- 创建健康等级表
drop table if exists t_health_level;
create table t_health_level
(
    level_id       bigint comment '健康等级ID',
    level_name     varchar(100)    null comment '健康等级名称'
) engine = Innodb default charset = utf8mb4 comment '健康等级表';
create index idx_health_level_name on t_health_level (level_name);

-- 创建健康任务表
drop table if exists t_health_task;
create table t_health_task
(
    task_id         bigint comment '健康任务ID',
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    task_name     varchar(100)    null comment '健康任务名称'
) engine = Innodb default charset = utf8mb4 comment '健康任务表';
create index idx_health_task_name on t_health_task (task_name);

-- 创建健康任务表
drop table if exists t_health_task0;
create table t_health_task0
(
    task_id         bigint comment '健康任务ID',
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    task_name     varchar(100)    null comment '健康任务名称'
) engine = Innodb default charset = utf8mb4 comment '健康任务表0';

-- 创建健康任务表
drop table if exists t_health_task1;
create table t_health_task1
(
    task_id         bigint comment '健康任务ID',
    record_id       bigint comment '健康记录ID',
    user_id         bigint comment '用户ID',
    task_name     varchar(100)    null comment '健康任务名称'
) engine = Innodb default charset = utf8mb4 comment '健康任务表1';

数据库表对应的Entity:

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_user")
@ApiModel(value="User对象", description="用户信息表")
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "用户ID")
    //@TableId(value = "user_id", type = IdType.INPUT)
    private Long userId;

    @ApiModelProperty(value = "用户名")
    private String userName;

    @Override
    protected Serializable pkVal() {
        return this.userId;
    }
}

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_health_level")
@ApiModel(value="HealthLevel对象", description="健康等级表")
public class HealthLevel extends Model<HealthLevel> {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "健康等级ID")
    //@TableId(value = "level_id", type = IdType.AUTO)
    private Long levelId;

    @ApiModelProperty(value = "健康等级名称")
    private String levelName;

    @Override
    protected Serializable pkVal() {
        return this.levelId;
    }
}

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_health_record")
@ApiModel(value="HealthRecord对象", description="健康记录表")
public class HealthRecord extends Model<HealthRecord> {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "健康记录ID")
    //@TableId(value = "record_id", type = IdType.INPUT)
    private Long recordId;

    @ApiModelProperty(value = "用户ID")
    private Long userId;

    @ApiModelProperty(value = "健康等级ID")
    private Long levelId;

    @ApiModelProperty(value = "描述信息")
    private String remark;

    @Override
    protected Serializable pkVal() {
        return this.recordId;
    }
}

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_health_task")
@ApiModel(value="HealthTask对象", description="健康任务表")
public class HealthTask extends Model<HealthTask> {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "健康任务ID")
    //@TableId(value = "task_id", type = IdType.INPUT)
    private Long taskId;

    @ApiModelProperty(value = "健康记录ID")
    private Long recordId;

    @ApiModelProperty(value = "用户ID")
    private Long userId;

    @ApiModelProperty(value = "健康任务名称")
    private String taskName;

    @Override
    protected Serializable pkVal() {
        return this.taskId;
    }
}

向HealthRecord和HealthTask插入记录:

@Service
public class DemoServiceImpl implements DemoService {

    @Resource
    private HealthRecordMapper healthRecordMapper;
    @Resource
    private HealthTaskMapper healthTaskMapper;

    @Override
    public void processHealthRecords() throws SQLException {
        insertHealthRecords();
    }

    private List<Long> insertHealthRecords() throws SQLException {
        List<Long> result = new ArrayList<>(10);
        for (int i = 1; i <= 10; i++) {
            HealthRecord healthRecord = insertHealthRecord(Long.valueOf(i));
            insertHealthTask(Long.valueOf(i), healthRecord);
            result.add(healthRecord.getRecordId());
        }
        return result;
    }

    private HealthRecord insertHealthRecord(final Long i) throws SQLException {
        HealthRecord healthRecord = new HealthRecord();
        healthRecord.setUserId(i);
        healthRecord.setLevelId(i % 5);
        healthRecord.setRemark("Remark" + i);
        healthRecordMapper.insertHealthRecord(healthRecord);
        return healthRecord;
    }

    private void insertHealthTask(final Long i, final HealthRecord healthRecord) throws SQLException {
        HealthTask healthTask = new HealthTask();
        healthTask.setRecordId(healthRecord.getRecordId());
        healthTask.setUserId(i);
        healthTask.setTaskName("TaskName" + i);
        healthTaskMapper.insert(healthTask);
    }
}

shardingsphere5.1.1分表分库yaml配置 自定义策略 shardingsphere5.1.1版本 阅读详情

相关推荐

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3020

ShardingSphere分库分表及扩缩容策略

结合范围分片和取模分片的优点,订单系统先按范围分片,10月业务量小,分两个节点node1和node2,节点数表示对数据拆分的粒度,orderId%10,得到最终存放的节点位置node1或node2。node1和node2不仅存了10月的数据,还存了11月的数据,那它们的数据会比node3更多,node3只存了11月数据的1/3,可以给node3的权重分多一点。可以保证唯一性,但它是字符串,且不能保证单调递增,那么维护主键索引的成本就变大了,插入数据后,会产生页分裂。,会出现ID重复,且容易暴漏系统业务量。

u014518603的博客 2207

【分库分表】基于mysql+shardingSphere的分库分表技术

分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃?单表过大的话,读请求进来,查数据需要的时间会过长读请求过多,单节点IO压力太大,IO压力太大会造成什么?可能会造成IO阻塞,造成响应速度变慢。分库分表是指的两种维度,一种维度是分库,另一种维度是分表。分的话有两种分法,一种是水平分,另一种是垂直分。水平分是指将数据分为多段,一个服务器节点上存放一段,读写的时候走自己要的那一段所在服务器上。一段也叫一个分片(sharding)

m0_74823239的博客 1557

ShardingSphere系列二(ShardingSphere实现分库分表)

当业务系统逐渐增大时,单库单表不足以支撑起整个业务,性能会急速下降,这是就需要分库分表; 垂直拆分 垂直分库 垂直分库针对的是系统中的不同业务进行拆分。如用户一个库,订单一个库、商品一个库…分库之后减小了单库的压力,但单机压力并不会缓解多少,可以通过把库放到不同的服务器上解决。 垂直分表 “大表拆小表”,基于列字段进行拆分。一般是对表中的字段较多的表进行拆分,将不常用的、数据较大、长度较长的拆分到...

xingze的博客 2450

ShardingSphere 分库分表

目录一、ShardingSphere1.1 简介1.2 什么是分库分表1.3 分库分表之垂直拆分1.4 分库分表之水平切分二、 ShardingSphere-JDBC2.1 简介2.2 Sharding-JDBC 分表实操2.3 实现水平分表2.3.1 配置 Sharding-JDBC 分片策略2.4 实现水平分库2.4 实现垂直分库2.5 公共表2.6 读写分离2.6.1 什么是读写分离2.6.2 主从复制原理2.6.3 什么是读写分离 一、ShardingSphere 1.1 简介 Apache Sha

wangbeita的博客 1450

shardingsphere分库分表跨库访问原理

分片规则:根据分片键和分片算法,将数据分片到不同的数据库和表。SQL 路由:根据分片规则,ShardingSphere 会将 SQL 路由到具体的库或表。SQL 改写:ShardingSphere 会对 SQL 进行改写,使其指向正确的分片。并行执行:对于跨库查询,ShardingSphere 会将 SQL 并行分发到多个数据库执行。结果归并:ShardingSphere 会将多个库的查询结果进行合并,返回给应用层。事务管理:ShardingSphere 支持多种事务机制,保证跨库操作的一致性。

weixin_39304656的博客 2292

ShardingSphere分库分表

ShardingSphere分库分表学习

新入坑的嵌入式的小白 4655

ShardingSphere分库分表教程 | Spring Boot 34

一、分库分表 1、随着时间和业务发展,数据库数据量不可控,造成表中数据越来越多,此时再进行CRUD操作的话,会造成很大的性能问题,比如查询实时数据,表数据达到了千万级别,要求一分钟查询一次,但你一个select就要耗时2两分钟才能执行完,这岂不是很尴尬。 2、分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。 3、性能解决方案 方案1 通过提升

学Java,找哪吒 1万+

【分库分表ShardingSphere】

文章目录一、ShardingSphere二、ShardingJDBC实战1、核心概念2、测试项目介绍3、快速实战4、ShardingJDBC的分片算法NoneShardingStrategyInlineShardingStrategyStandardShardingStrategyComplexShardingStrategyHintShardingStrategy5、ShardingSphere的SQL使用限制6、分库分表带来的问题7、分库分表方案设计实战三、内核剖析解析引擎路由引擎改写引擎执行引擎归并引

我是Java程序员廖志伟,感谢朋友们的支持! 6014

EPLAN二次开发实战指南:从API接口到定制化界面

本文为EPLAN二次开发实战指南,详细介绍了从搭建C#开发环境、理解API接口到创建定制化插件的完整流程。通过实战案例,如批量修改设备属性和设计交互式界面,帮助电气工程师利用EPLAN二次开发实现工作流程自动化与深度定制,从而显著提升设计效率。

weixin_29246195的博客 807

ROS2_Moveit2_Ur5e_Grasp项目详解(二):核心模块功能解析

本文深入解析了ROS2_Moveit2_Ur5e_Grasp项目的核心模块功能。重点阐述了OctoMap建图模块如何为机械臂提供实时三维环境感知,并详细介绍了Robotiq夹爪与MoveIt2的集成控制、UR5e的运动规划策略,以及视觉模块如何协同工作,最终实现从目标检测到动态抓取的完整闭环。

weixin_29254029的博客 113

ShardingSphere分库分表教程

业务代码无需感知底层分片逻辑。

qq_44431362的博客 2209

告别瞎猜!用通达信L2资金流向函数,手把手教你识别主力动向(附实战公式)

本文详细解析通达信L2资金流向函数,手把手教你构建主力动向监控系统。通过分档数据解析、委买委卖攻防解读及实战公式应用,帮助投资者精准识别主力建仓与虚假拉升信号,提升股票交易决策效率。

weixin_26908317的博客 2103

ShardingSphere 分库分表入门实战

轻量级Java框架 -> ShardingSphere-JDBC,从0到1,分库分表入门实战!

但行好事,莫问前程 1669

保姆级教程:用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信(附完整代码)

本文详细介绍了如何利用GD32F470的EXMC Bank0 Region0与FPGA实现16位并行通信,涵盖硬件连接、寄存器配置、时序优化及FPGA接口设计等关键步骤。通过实例代码和调试技巧,帮助开发者快速掌握高效数据交互技术,提升嵌入式系统设计能力。

weixin_26918763的博客 226

ESP32-C5硬件设计全链路指南:ADC/SDIO/USB/RF PCB实战

模数转换器(ADC)和高速外设接口是嵌入式系统硬件设计的核心基础。理解ADC通道映射、输入阻抗特性与抗干扰布线,是保障传感器采样精度的前提;掌握SDIO、USB差分信号的阻抗控制、端接策略与电源去耦方法,则直接决定通信可靠性与EMC性能。在Wi-Fi 6/Bluetooth 5.3双模SoC如ESP32-C5中,ADC复用约束、USB与SDIO管脚冲突、RF匹配网络调校、四层板叠层规划等工程细节,共同构成高成功率PCB落地的关键技术栈。本文聚焦ESP32-C5平台,系统梳理从模拟前端到射频输出的硬件设计规范

weixin_35756130的博客 346

集成ShardingSphere实现分库分表

ShardingSphere实现分库分表

lichunyu7199的博客 1422

安装oracle 19c 报错INS-06006 INS-44000 INS-32070

数据库版本oracle 19c 操作系统版本:centos7.8 安装oracle19c RAC 配置互信的时候setup显示成功,点test的时候报错INS-44000,继续点yes 报错INS-32070,继续往下点 报错INS-06006 处理过程 1.手动ssh node date 全部成功说明互信时没有问题的 2.查mos 文档ID 2555697.1 如果OpenSSH升级到8.x会有这个问题 MOS上的解决办法 #ssh -V OpenSSH_8.0p1, OpenSSL 1.0.2r 2

cqszpx的博客 1528

使用ShardingSphere进行分库分表

基因法 = 从分片键(二进制)中抽取一部分“基因位”,再用这部分去决定落库/落表。对于191 % 32 = 3110111111100000 也就是2的5次方11111可以发现31的二进制对应191后5位数。比如说 159,二进制是 10011111 ,对 32 取模,结果还是31。也就是说如果随便拿一个数转成二进制,然后把二进制的后5位替换成这个11111,然后将这个替换后的值对32进行取模,那么得到的余数也是31,这个5位长度就是靠32的二进制的长度也就是求log2n对数的值。

记得开心一点嘛的博客 1836

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决

Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。

奶爸的编程之路,也就一周冷个三天 1964

数学建模学习(121):Python实现模糊AHP(Fuzzy AHP)——从原理到实践

Python实现模糊AHP(Fuzzy AHP)

全栈川川 1542

ShardingSphere分库分表存储组件

关系数据库在信息化系统的存储方面起到举足轻重的作用,但存在IO和计算密集型瓶颈,于是出现很多对关系数据库提供分库分表存储的框架,其中ShardingSphere就是其中之一,并且对排序、分布式事务提供解决方案,ShardingSphere包括三个独立组件,你可以使用其中任意一个实现分库分表逻辑, ShardingSphere-JDBC ShardingSphere-Proxy ShardingSphere-Sidecar(TODO) ShardingSphere-JDBC是以独立Jar形式提供,在客户端系统

qixiang_chen的博客 1759

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SpringBoot+ShardingSphere分库分表

分库分表是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。● 水平分表将一个表的数据按一定规则拆分到多个表结构相同的表中。● 垂直分表将一个表按照字段拆分成多个表,每个表存储其中一部分字段。● 水平分库同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。● 垂直分库按照业务将表分布到不同的数据库上,达到专库专用。

ICEHAND_1214的博客 3679

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 一文搞懂二分查找算法
下一篇: Kafka核心原理之消息存储机制
南秋同学
博客等级 码龄7年 65粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值