网站建设需要域名,注册页面模板,金牛区建设和交通局网站,网页设计左右布局代码SpringBootMybatis-plusshardingsphere实现分库分表 文章目录 SpringBootMybatis-plusshardingsphere实现分库分表介绍引入依赖yaml配置DDL准备数据库ds0数据库ds1 entitycotrollerserviceMapper启动类测试添加修改查询删除 总结 介绍
实现亿级数据量分库分表的项目是一个挑战…SpringBootMybatis-plusshardingsphere实现分库分表 文章目录 SpringBootMybatis-plusshardingsphere实现分库分表介绍引入依赖yaml配置DDL准备数据库ds0数据库ds1 entitycotrollerserviceMapper启动类测试添加修改查询删除 总结 介绍
实现亿级数据量分库分表的项目是一个挑战性很高的任务下面是一个基于Spring Boot的简单实现方案 数据库选择使用MySQL数据库因为MySQL在分库分表方面有较成熟的解决方案。 分库分表策略可以采用水平分库分表的策略根据一定的规则将数据分散存储在不同的数据库和表中例如可以根据用户ID、订单ID等进行分片。 数据分片策略可以采用基于雪花算法的分布式ID生成器来生成全局唯一的ID确保数据在不同数据库和表中的唯一性。 数据同步考虑到数据分散存储在不同的数据库和表中需要实现数据同步机制来保证数据的一致性可以使用Canal等开源工具来实现MySQL数据的实时同步。 连接池优化在处理大量数据时连接池的配置尤为重要可以使用Druid等高性能的连接池来提升数据库连接的效率。 缓存机制考虑使用Redis等缓存工具来缓存热点数据减轻数据库的压力提升系统性能。 分布式事务在分库分表的场景下涉及到跨库事务可以考虑使用分布式事务框架如Seata等来保证事务的一致性。 监控与调优实时监控数据库的性能指标及时调整分片策略和数据库配置保证系统的稳定性和性能。
引入依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.28/version/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.3/version/dependency!--分库分表--!-- Sharding-JDBC --dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.2.0/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesyaml配置
server:port: 10086spring:shardingsphere:# 数据源配置datasource:# 数据源名称多数据源以逗号分隔names: db0,db1db0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/ds0?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueusername: rootpassword: rootdb1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/ds1?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueusername: rootpassword: root# 分片规则配置rules:sharding:# 分片算法配置sharding-algorithms:database-inline:# 分片算法类型type: INLINEprops:# 分片算法的行表达式算法自行定义此处为方便演示效果algorithm-expression: db$-{age % 2}table-inline:# 分片算法类型type: INLINEprops:# 分片算法的行表达式algorithm-expression: user_$-{age % 3}tables:# 逻辑表名称user:# 行表达式标识符可以使用 ${...} 或 $-{...}但前者与 Spring 本身的属性文件占位符冲突因此在 Spring 环境中使用行表达式标识符建议使用 $-{...}actual-data-nodes: db${0..1}.user_${0..2}# 分库策略database-strategy:standard:# 分片列名称sharding-column: age# 分片算法名称sharding-algorithm-name: database-inline# 分表策略table-strategy:standard:# 分片列名称sharding-column: age# 分片算法名称sharding-algorithm-name: table-inline# 属性配置props:# 展示修改以后的sql语句sql-show: trueDDL准备
数据库ds0
-- ds0.user_0 definitionCREATE TABLE user_0 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;-- ds0.user_1 definitionCREATE TABLE user_1 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;-- ds0.user_2 definitionCREATE TABLE user_2 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;数据库ds1
-- ds1.user_0 definitionCREATE TABLE user_0 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;-- ds1.user_1 definitionCREATE TABLE user_1 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;-- ds1.user_2 definitionCREATE TABLE user_2 (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(32) NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,PRIMARY KEY (id)
) ENGINEInnoDB COMMENT用户表;entity
package com.kang.sharding.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;Data
TableName(user)
public class User {TableId(value id,type IdType.AUTO)private Long id;private String name;private Integer age;// getter, setter, toString...
}cotroller
package com.kang.sharding.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.kang.sharding.entity.User;
import com.kang.sharding.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;RestController
RequestMapping(/user)
public class UserController { Autowired private UserService userService;PostMapping (add)public boolean createUser(RequestBody User user) {return userService.save(user); }PostMapping (update)public boolean updateByAge(RequestBody User user){LambdaUpdateWrapperUser updateWrapper new LambdaUpdateWrapper();// 分片数据不允许更新,否则会报错updateWrapper.eq(User::getAge,user.getAge()).set(User::getName,user.getName());return userService.update(updateWrapper);}GetMapping (delete)public boolean deleteUserByAge(RequestParam(age) Integer age) {LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();queryWrapper.eq(User::getAge,age);return userService.remove(queryWrapper);}GetMapping(/{age})public ListUser getUserByAge(PathVariable Integer age) {LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();queryWrapper.eq(User::getAge,age);return userService.list(queryWrapper);} // 其他方法...
}service
package com.kang.sharding.service;import com.kang.sharding.entity.User;
import com.kang.sharding.mapper.UserMapper;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; Service
public class UserService extends ServiceImplUserMapper, User {
}Mapper
package com.kang.sharding.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kang.sharding.entity.User;
import org.apache.ibatis.annotations.Mapper;Mapper
public interface UserMapper extends BaseMapperUser {
}启动类
package com.kang.sharding;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class ShardingJdbcProjectApplication {public static void main(String[] args) {SpringApplication.run(ShardingJdbcProjectApplication.class, args);}}测试
添加 修改 查询 删除 总结 这只是个简单的入门示例,后续深入研究