精华内容
下载资源
问答
  • springboot分库分表方案
    千次阅读 热门讨论
    2020-12-30 19:39:02

    基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一)

    假定我们现在已经使用spring boot编写了一套系统,随着我们的系统的不断使用,其中某些表的数据量已经突破了单表千万的数据量,这时候我们该怎么办呢?ShardingSphere就是你需要的解决方案,购买了专栏的小伙伴可以加微信:aaabbb158,加微信的时候请加上您购买专栏的当前账号名称的备注,我会为你解答你遇到相应的问题,同时为您提供当前专栏的源代码。

    1、什么是ShardingSphere

    Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

    Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。

    Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及对 My

    更多相关内容
  • 在基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一)中我们讲解了基于5.0.0-alpha版的分表的解决方案,那么在本章我们将为大家讲解5.0.0版本的分表解决方案 1、创建数据库 打开我们的...

    基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一)中我们讲解了基于5.0.0-alpha版的分表的解决方案,那么在本章我们将为大家讲解5.0.0版本的分表解决方案

    1、创建数据库

    打开我们的Navicat for MySQL的数据库管理工具,然后我们连上一个属于我们自己的数据库,然后创建一个测试的数据库如下所示:

    请添加图片描述

    2、执行SQL脚本

    然后我们直接在Navicat for MySQL的数据库管理工具中执行以下的脚本:

    drop table if exists t_order0;
    
    /
    展开全文
  • 本文主要采用SpringBoot + MyBatisPlus + sharding-jdbc技术实现分库分表,基于yaml配置。 理论:ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy 和 ...

    声明

    引用上文继续优化分库分表,上部分是单库分表
    分库分表在原基础改动,变动不多

    点我:java springboot mysql shardingsphere 分库分表 上 (单库分表)

    yaml配置文件变动

    server:
      port: 7070
    spring:
      application:
        name: shadingsphere-name
      main:
        # 一个实体类对应两张表,覆盖 否则会报错
        allow-bean-definition-overriding: true
      shardingsphere:
        #配置数据源
        datasource:
          names: m1,m2
          m1:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/sharding0?serverTimezone=GMT%2B8
            username: root
            password: wuzhenyong1207
          m2:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/sharding1?serverTimezone=GMT%2B8
            username: root
            password: wuzhenyong1207
        sharding:
          # 默认数据库策略
          #default-database-strategy:
          #  inline:
          #    sharding-column: empno
          #    algorithm-expression: m$->{empno % 2 }
          tables:
            # 表名
            emp:
              # 配置表在哪个数据库里面 m1.emp0 ,m1.emp1
              actual-data-nodes: m$->{1..2}.emp$->{0..1}
              # 生成ID
              key-generator:
                column: id
                # 自定义主键生成类型  官网有两种:UUID, SNOWFLAKE 雪花算法
                type: SIMPLE
              # 指定表分片策略
              table-strategy:
                inline:
                  sharding-column: id
                  algorithm-expression: emp$->{id % 2 }
              # 指定表 数据库分片策略
              database-strategy:
                inline:
                  sharding-column: empno
                  algorithm-expression: m$->{empno % 2 + 1}
        props:
          # 开启sql日志
          sql:
            show: true
    
    

    小说明:指定表 数据库分片策略的字段尽量不要和表的策略字段是一样的,否则插入的表不会分散开

    控制层方法更改

    empno字段使用随即生成数 生成0或1

    @GetMapping("/save")
    public String save() {
        int last = 50;
        for (int i = 0; i < 20; i++) {
            String value = String.valueOf(i);
            EmpEntity entity = new EmpEntity();
            entity.setEmpno(getRandomNum());
            entity.setEmpname(value);
            entity.setJob(value);
            entity.setMgr(value);
            entity.setHiredate(LocalDateTime.now());
            entity.setSal(new BigDecimal(value));
            entity.setComn(new BigDecimal(value));
            entity.setDepno(value);
    
            empMapper.insert(entity);
        }
        return "添加成功";
    }
    
    
    /**
     * 生成 0 或 1两个数
     * @return
     */
    private int getRandomNum(){
        return (int) (Math.random() * 2);
    }
    

    测试同上文,完成

    展开全文
  • ShardingSphere实现分库分表、水平拆分、垂直拆分、公共部分

    分库别表主要有两种解决方案:垂直拆分、水平拆分

    垂直拆分

    操作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一 部分字段数据存到另外一张表里面 例如:将商品基本信息放在一张表,商品详情放在一张表

    水平拆分

    将一个数据库,拆分为两个相同结构的数据库,存储数据

    存储方式

    方式一:按id取模方式实现,缺点:不好扩容

    方式二:按id分片实现,缺点:因为id连续,热点数据可能会集中到一个数据库

    其他思路:大范围按时间分,小范围取模分

    分库分表可能出现的问题:

    事务一致性问题:单表操作事务执行失败可以回滚,分表之后可能会插入到多条数据库

    跨节点关联查询:当查询固定范围的数据也在多个数据库中

    主键避重问题:数据库表主键冲突

    所以在开发中:数据增加不要立马做水平拆分,首先考虑缓存处理,读写分离,使用索引等

    ShardingSphere

    开源分布式数据库中间件解决方案,主要有Sharding-JDBC和Sharding-Proxy

    客户端分库分表:以jar包形式放在java应用里,通过Sharding-JDBC去找对应数据,主要作用数据分片,读写分离

    服务端分库分表:利用Sharding-Proxy伪装成数据库,分库分表由Sharding-Proxy实现

    Sharding-JDBC实现水平分表

    创建数据库,按水平分表方式

    在数据库创建两张表 course_1 和 course_2

    约定规则:如果添加课程 id 是偶数把数据添加 course_1,如果奇数添加到 course_2

    创建springboot项目,添加依赖

    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
         <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid-spring-boot-starter</artifactId>
         <version>1.1.20</version>
         </dependency>
         <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         </dependency>
         <dependency>
         <groupId>org.apache.shardingsphere</groupId>
         <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
         <version>4.0.0-RC1</version>
         </dependency>
         <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>mybatis-plus-boot-starter</artifactId>
         <version>3.0.5</version>
         </dependency>
         <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         </dependency>

    实体类

    @Data
    public class Course {
        private Long cid;
        private String cname;
        private Long userId;
        private String cstatus;
    }

    mapper层

    @Repository
    public interface CourseMapper extends BaseMapper<Course> {
    }

    启动类加注解

    @MapperScan("com.lzq.mapper")

    配置 Sharding-JDBC 分片策略

    在配置文件中配置

    # shardingjdbc 分片策略
    # 配置数据源,给数据源起名称
    spring.shardingsphere.datasource.names=m1
    
    # 一个实体类对应两张表,覆盖
    spring.main.allow-bean-definition-overriding=true
    
    #配置数据源具体内容,包含连接池,驱动,地址,用户名和密码
    spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/sharding?serverTimezone=GMT%2B8
    spring.shardingsphere.datasource.m1.username=root
    spring.shardingsphere.datasource.m1.password=root
    #指定 course 表分布情况,配置表在哪个数据库里面,表名称都是什么 m1.course_1 ,m1.course_2
    spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}
    # 指定 course 表里面主键 cid 生成策略 SNOWFLAKE 雪花算法
    spring.shardingsphere.sharding.tables.course.key-generator.column=cid
    spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
    # 指定分片策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到 course_2表
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}
    # 打开 sql 输出日志
    spring.shardingsphere.props.sql.show=true

    测试

    @SpringBootTest
    class ShardingJdbcApplicationTests {
        @Autowired
        private CourseMapper courseMapper;
        @Test
        void add() {
            Course course = new Course();
            course.setCname("java");
            course.setUserId(10l);
            course.setCstatus("normal");
            courseMapper.insert(course);
        }
        @Test
        public void find(){
            QueryWrapper<Course> wrapper = new QueryWrapper<>();
            wrapper.eq("cid",714887289653690369l);
            Course course = courseMapper.selectOne(wrapper);
            System.out.println(course);
        }
    }

    springboot版本不同可能会报错,由于一个实体类对应两个数据库,在配置文件添加

    spring.main.allow-bean-definition-overriding=true

    水平分库

    创建两个数据库,每个数据库里创建两个表分别为course_1 和 course_2

    约定分片规则:userid为偶数加入第一个数据库,cid为偶数放入course_1表

    修改之前代码:配置分片规则,在配置文件中加入

    # 配置数据源,给数据源起名称,
    # 水平分库,配置两个数据源
    spring.shardingsphere.datasource.names=m1,m2 
     
    # 一个实体类对应两张表,覆盖
    spring.main.allow-bean-definition-overriding=true 
     
    #配置第一个数据源具体内容,包含连接池,驱动,地址,用户名和密码
    spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/edu_db_1?serverTimezone=GMT%2B8 
    spring.shardingsphere.datasource.m1.username=root 
    spring.shardingsphere.datasource.m1.password=root 
     
    #配置第二个数据源具体内容,包含连接池,驱动,地址,用户名和密码
    spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/edu_db_2?serverTimezone=GMT%2B8 
    spring.shardingsphere.datasource.m2.username=root 
    spring.shardingsphere.datasource.m2.password=root 
     
    #指定数据库分布情况,数据库里面表分布情况
    # m1 m2 course_1 course_2
    spring.shardingsphere.sharding.tables.course.actual-data-nodes=m$->{1..2}.course_$->{1..2} 
     
    # 指定 course 表里面主键 cid 生成策略 SNOWFLAKE
    spring.shardingsphere.sharding.tables.course.key-generator.column=cid 
    spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE 
     
    # 指定表分片策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到course_2 表
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding.column=cid 
    spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm.expression=course_$->{cid % 2 + 1} 
     
    # 指定数据库分片策略 约定 user_id 是偶数添加 m1,是奇数添加 m2
    #spring.shardingsphere.sharding.default-database-strategy.inline.sharding.column=user_id
    #spring.shardingsphere.sharding.default-database-strategy.inline.algorithm.expression=m$->{user_id % 2 + 1}
    #写法二 对具体表有固定规则
    spring.shardingsphere.sharding.tables.course.database-strategy.inline.sharding-column=user_id 
    spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m$->{user_id % 2 + 1}

    测试同上

    垂直分库

    专库专用,查询用户信息时去用户数据库查用户表

    创建数据库user_db,创建用户信息表t_user

    创建实体类与mapper

    @Data
    @TableName(value = "t_user") //指定对应表
    public class User {
        private Long userId;
        private String username;
        private String ustatus;
    }
    
    @Repository
    public interface UserMapper extends BaseMapper<User> {
    }

    配置文件添加

    # 配置数据源,给数据源起名称
    spring.shardingsphere.datasource.names=m1,m2,m0
    .....
    #配置第三个数据源具体内容,包含连接池,驱动,地址,用户名和密码
    spring.shardingsphere.datasource.m0.type=com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m0.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.shardingsphere.datasource.m0.url=jdbc:mysql://localhost:3306/user_db?serverTimezone=GMT%2B8 
    spring.shardingsphere.datasource.m0.username=root 
    spring.shardingsphere.datasource.m0.password=root 
     
    # 配置 user_db 数据库里面 t_user 专库专表
    spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->{0}.t_user 
     
    # 指定 course 表里面主键 cid 生成策略 SNOWFLAKE
    spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id 
    spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE 
    

    公共表

    存储固定数据,很少发生变化,查询时需要进行关联,例如用户的状态表,字典等

    在多个数据需中都创建相同结构的表

    在配置文件中添加

    # 配置公共表
    spring.shardingsphere.sharding.broadcast-tables=t_udict 
    spring.shardingsphere.sharding.tables.t_udict.key-generator.column=dictid 
    spring.shardingsphere.sharding.tables.t_udict.key-generator.type=SNOWFLAKE

    当有修改操作时,会向多个数据库中t_udict表进行修改

    展开全文
  • 具体的介绍可以上它的文档那里看看,简单归纳起来就是,它是一个增强版的JDBC,对使用者透明,逻辑代码什么的都不用动,它来完成分库分表的操作;然后它还支持分布式事务(不完善)。看起来很不错的样子。 下面用个...
  • SpringBoot整合MyBatis实现分库分表方案

    千次阅读 2020-05-18 09:38:55
    SpringBoot整合MyBatis实现分库分表方案 SpringBoot整合Mybatis实现分库分表查询, 这里不讲解SpringBoot如何整合MyBatis ,只讲解SpringBoot整合MyBatis下的实现分库分表的实现方案。 我
  • Java+Springboot+mybatis+sharding jdbc 实现分库分表
  • springboot+mybaties实现分库分表

    千次阅读 2022-03-13 21:12:34
    1.导包必须有的 <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <...org.sp.
  • 目前支持MySQL,Oracle,SQLServer和PostgreSQL 1.4 Sharding-JDBC主要实现数据分片和读写分离,通过Sharding-JDBC,应用可以透明的使用jdbc访问已经分库分表,读写分离的多个数据源,而不用关心数据源的数量以及...
  • 1、不分库分表的解决方案方案需要如下的前置条件: 当前表不分库也不分表【在db0.t_user】 其他库不存在和这张表名称一样的表的若你 若你的需求满足以上的场景则直接使用以下的方案,首先我们的代码都是基于第...
  • 本文主要采用SpringBoot + MyBatisPlus + sharding-jdbc技术实现分库分表,基于yaml配置。 理论:ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy 和 ...
  • 在基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二)中我们讲解了基于5.0.0-alpha版的分库的解决方案,那么在本章我们将为大家讲解5.0.0版本的分表解决方案 1、创建分库数据库 在上一章...
  • Spring Boot 分库分表

    万次阅读 2019-07-03 19:58:11
    方案:可以使用拦截器拦截mybatis框架,在执行SQL前对SQL语句根据路由字段进行分库分表操作,下例只做分表功能 @Intercepts:申明需要拦截的方法 拦截StatementHandler对象 一、statementHandler对象的定义: 首先...
  • SpringBoot2+MybatisPlus+读写分离+分库分表 课程目标 快速的掌握读写分离+分表的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介 ShardingSphere是一套开源的分布式...
  • ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。? ...
  • 如何基于Springboot快速集成分库分表框架,尽量做到开箱即用 当然除了ShardingSphere之外,还有其他分库分表框架,如:Cobar,MyCat等 ShardingSphere介绍 ShardingSphere 是一套开源的分布式数据库中间件解决方案...
  • 当用户表达到千万级别,在做很多操作的时候都会很吃力,所以当数据增长到 1000 万以上就需要分库分表来缓解单库(表)的压力。 二、什么是分库分表 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库...
  • JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。 Mycat关键特性 支持SQL92标准 支持MySQL、Oracle、DB2、SQL Serv
  • 我们现在的订单表中是没有店家的流水ID,那这时候我们需要根据店家的流水ID来进行片,那我们该如何处理呢,这在我们的现实场景中是有可能遇到的一种场景,那么ShardingSphere为我们提供了强制片的解决方案,那么...
  • 数据量达到一定程度的话可能就会进行分库分表,所以最近研究了一个分库分表的插件ShardingJDBC,因为myCat或者其他的开源插件都已经不维护了或者停止更新,目前ShardingJDBC比较活跃,而且不用进行单独部署工作,这...
  • 今天来聊下 SpringBoot 集成 Sharding-JDBC 实现分库分表;为此写了一个小 Demo,这个Demo是基于SpringBoot,并集成了 Mybatis、Redis、Swagger(生成在线的接口文档 )、PageHelper(分页工具)等,当然绝对也集成...
  • 本文将基于SpringBoot+MybatisPlus+Sharding-JDBC+Mysql实现企业级分库分表。 1、组件及版本选择 2、预期目标 使用上述组件实现分库分表,简化起见只讨论分表技术 完成分表后的逻辑表与物理表间的增删查改 引入...
  • ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,我们只关注 Sharding-JDBC即可. 官方地址:...
  • 快速的掌握分库的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。 它由Sharding-JDBC、...
  • 库分表
  • ShardingJDBC是ShardingSphere的一个子项,它提供数据库分库分表、读写分离等解决方案。像是京东、当当、唯品会、转转、中通、三只松鼠等都在用ShardingSphere。 一句话总结:它是国产的、开源的、配置简单的一套...
  • 随着业务的不断增长,数据也飞速增长,访问也随之变慢,添加从库、新建索引等很多操作仍严重下降,分库分表需求迫在眉睫。 方案一: 通过提升服务性能来提升数据处理能力,例如:扩容、CPU等,但成本很高。 方案
  • 在基于springboot的ShardingSphere5.X的分库分表的解决方案之自动时间段分片算法解决方案(二十四)中我们讲解了基于5.0.0-alpha版的自动时间段分片算法的解决方案,那么在本章我们将为大家讲解5.0.0版本自动时间段分...
  • springboot 按月分表的优雅实现方式

    千次阅读 2022-01-14 11:59:09
    一、项目背景 1、分表的方式 二、代码实现 1、pom文件依赖 2、配置文件 3、MybatisPlusConfig...这种情况下导致的慢查询,单纯从sql优化的角度是无法解决的,此时我们就会用到分库分表。由于我们目前的问题是部分mys

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,854
精华内容 2,741
热门标签
关键字:

springboot分库分表方案

spring 订阅
友情链接: mfcgdiplus.zip