java springboot mysql shardingsphere 分库分表 上 (单库分表)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: java springboot mysql shardingsphere 分库分表 上 (单库分表)

1、主要技术

本文主要采用SpringBoot + MyBatisPlus + sharding-jdbc技术

实现:单库分表 、分库分表 水平拆分

数据库:sharding0、sharding1

表:emp0、emp1

2、数据库脚本

# 数据库自行创建
CREATE TABLE `emp0` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `empno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `empname` varchar(20) NOT NULL DEFAULT '',
  `job` varchar(9) NOT NULL DEFAULT '',
  `mgr` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `hiredate` datetime NOT NULL,
  `sal` decimal(7,2) NOT NULL,
  `comn` decimal(7,2) NOT NULL,
  `depno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6000091 DEFAULT CHARSET=utf8;
CREATE TABLE `emp1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `empno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `empname` varchar(20) NOT NULL DEFAULT '',
  `job` varchar(9) NOT NULL DEFAULT '',
  `mgr` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `hiredate` datetime NOT NULL,
  `sal` decimal(7,2) NOT NULL,
  `comn` decimal(7,2) NOT NULL,
  `depno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6000091 DEFAULT CHARSET=utf8;

3、引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.0.5</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

4、单库分表

4.1、yaml文件

server:
  port: 7070
spring:
  application:
    name: shadingsphere-name
  main:
    # 一个实体类对应两张表,覆盖 否则会报错
    allow-bean-definition-overriding: true
  shardingsphere:
    #配置数据源
    datasource:
      names: m1
      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
    sharding:
      tables:
        # 表名
        emp:
          # 配置表在哪个数据库里面 m1.emp0 ,m1.emp1
          actual-data-nodes: m1.emp$->{0..1}
          # 生成ID
          key-generator:
            column: id
            # 自定义主键生成类型  官网有两种:UUID, SNOWFLAKE 雪花算法
            type: SIMPLE
          # 指定分片策略
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: emp$->{id %2}
    props:
      # 开启sql日志
      sql:
        show: true

4.2、自定义主键生成策略

说明:因为数据库是自增,所以采用自定义主键生成策略

实际请项目请自行实现自增策略,否则会出现id重复问题,本文只是演示

/**
 * 自定义主键生成策略
 *
 * @author wuzhenyong
 * @date 2022/05/26
 */
public class SimpleShardingKeyGenerator implements ShardingKeyGenerator {
    private AtomicLong atomic = new AtomicLong(0);
    @Getter
    @Setter
    private Properties properties = new Properties();
    @Override
    public Comparable<?> generateKey() {
        return atomic.incrementAndGet();
    }
    @Override
    public String getType() {
      // 类型名称
        return "SIMPLE";
    }
}

4.3、spi机制

在resources文件夹下新建

META-INF/services/

org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator 文件

文件内容为:自定义主键生成策略所在包路径.SimpleShardingKeyGenerator

28cf6f3984e04988a8571c705a751c72[0].png

4.4、新建实体类、mapper层、controller层

4.4.1、实体类
@TableName("emp")
@Data
public class EmpEntity {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer empno;
    private String empname;
    private String job;
    private String mgr;
    private LocalDateTime hiredate;
    private BigDecimal sal;
    private BigDecimal comn;
    private String depno;
}
4.4.2、mapper
@Mapper
public interface EmpMapper extends BaseMapper<EmpEntity>{
}
4.4.3、controller
/**
 * @author wuzhenyong
 * ClassName:EmpController.java
 * date:2022-05-26 10:56
 * Description:
 */
@RestController
@RequestMapping("/emp")
@AllArgsConstructor
public class EmpController {
    private final EmpMapper empMapper;
    @GetMapping("/save")
    public String save() {
        for (int i = 0; i < 20; i++) {
            String value = String.valueOf(i);
            EmpEntity entity = new EmpEntity();
            entity.setEmpno(value);
            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 "添加成功";
    }
    @GetMapping("/list")
    public List<EmpEntity> list() {
        List<EmpEntity> empEntities = empMapper.selectList(new QueryWrapper<EmpEntity>()
                .lambda()
                .orderByDesc(EmpEntity::getId));
        return empEntities;
    }
    @GetMapping("/update/{id}")
    public String update(@PathVariable Integer id) {
        EmpEntity entity = empMapper.selectById(id);
        entity.setHiredate(LocalDateTime.now());
        empMapper.updateById(entity);
        return "更新成功";
    }
}

4.5、测试运行

4.5.1运行保存方法

控制台日志,日志太长了显示不全

2d3a016e4d1b47ec849f046517663b3e.png

4.5.2查看表数据

emp0表

c144d8debe984e57b5eee3be13afb76c.png

emp1表

3de1a3d1b9bf47718a93ff2c32dff0a2.png

5、分库分表请看下文

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
9月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
441 13
|
11月前
|
人工智能 Java 关系型数据库
Java的时间处理与Mysql的时间查询
本文总结了Java中时间与日历的常用操作,包括时间的转换、格式化、日期加减及比较,并介绍了MySQL中按天、周、月、季度和年进行时间范围查询的方法,适用于日常开发中的时间处理需求。
212 0
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
411 10
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
567 5
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
2161 103
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
前端开发 Java Spring
Java:SpringBoot实现文件上传
Java:SpringBoot实现文件上传
411 0
|
前端开发 Java Spring
Java:SpringBoot实现文件上传
Java:SpringBoot实现文件上传
310 0
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
413 1

热门文章

最新文章

推荐镜像

更多