SpringBoot+Mybatis-plus+shardingsphere實(shí)現(xiàn)分庫分表的方案
SpringBoot+Mybatis-plus+shardingsphere實(shí)現(xiàn)分庫分表
介紹
實(shí)現(xiàn)億級數(shù)據(jù)量分庫分表的項(xiàng)目是一個(gè)挑戰(zhàn)性很高的任務(wù),下面是一個(gè)基于Spring Boot的簡單實(shí)現(xiàn)方案:
- 數(shù)據(jù)庫選擇:使用MySQL數(shù)據(jù)庫,因?yàn)镸ySQL在分庫分表方面有較成熟的解決方案。
- 分庫分表策略:可以采用水平分庫分表的策略,根據(jù)一定的規(guī)則將數(shù)據(jù)分散存儲在不同的數(shù)據(jù)庫和表中,例如可以根據(jù)用戶ID、訂單ID等進(jìn)行分片。
- 數(shù)據(jù)分片策略:可以采用基于雪花算法的分布式ID生成器來生成全局唯一的ID,確保數(shù)據(jù)在不同數(shù)據(jù)庫和表中的唯一性。
- 數(shù)據(jù)同步:考慮到數(shù)據(jù)分散存儲在不同的數(shù)據(jù)庫和表中,需要實(shí)現(xiàn)數(shù)據(jù)同步機(jī)制來保證數(shù)據(jù)的一致性,可以使用Canal等開源工具來實(shí)現(xiàn)MySQL數(shù)據(jù)的實(shí)時(shí)同步。
- 連接池優(yōu)化:在處理大量數(shù)據(jù)時(shí),連接池的配置尤為重要,可以使用Druid等高性能的連接池來提升數(shù)據(jù)庫連接的效率。
- 緩存機(jī)制:考慮使用Redis等緩存工具來緩存熱點(diǎn)數(shù)據(jù),減輕數(shù)據(jù)庫的壓力,提升系統(tǒng)性能。
- 分布式事務(wù):在分庫分表的場景下,涉及到跨庫事務(wù),可以考慮使用分布式事務(wù)框架,如Seata等來保證事務(wù)的一致性。
監(jiān)控與調(diào)優(yōu):實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)庫的性能指標(biāo),及時(shí)調(diào)整分片策略和數(shù)據(jù)庫配置,保證系統(tǒng)的穩(wěn)定性和性能。
引入依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!--分庫分表--> <!-- Sharding-JDBC --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
yaml配置
server: port: 10086 spring: shardingsphere: # 數(shù)據(jù)源配置 datasource: # 數(shù)據(jù)源名稱,多數(shù)據(jù)源以逗號分隔 names: db0,db1 db0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/ds0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root db1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/ds1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root # 分片規(guī)則配置 rules: sharding: # 分片算法配置 sharding-algorithms: database-inline: # 分片算法類型 type: INLINE props: # 分片算法的行表達(dá)式(算法自行定義,此處為方便演示效果) algorithm-expression: db$->{age % 2} table-inline: # 分片算法類型 type: INLINE props: # 分片算法的行表達(dá)式 algorithm-expression: user_$->{age % 3} tables: # 邏輯表名稱 user: # 行表達(dá)式標(biāo)識符可以使用 ${...} 或 $->{...},但前者與 Spring 本身的屬性文件占位符沖突,因此在 Spring 環(huán)境中使用行表達(dá)式標(biāo)識符建議使用 $->{...} 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: true
DDL準(zhǔn)備
數(shù)據(jù)庫ds0
-- ds0.user_0 definition CREATE TABLE `user_0` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用戶表';
-- ds0.user_1 definition CREATE TABLE `user_1` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用戶表';
-- ds0.user_2 definition CREATE TABLE `user_2` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用戶表';
數(shù)據(jù)庫ds1
-- ds1.user_0 definition CREATE TABLE `user_0` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用戶表';
-- ds1.user_1 definition CREATE TABLE `user_1` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用戶表';
-- ds1.user_2 definition CREATE TABLE `user_2` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(32) NOT NULL COMMENT '姓名', `age` int NOT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB 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){ LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); // 分片數(shù)據(jù)不允許更新,否則會報(bào)錯 updateWrapper.eq(User::getAge,user.getAge()).set(User::getName,user.getName()); return userService.update(updateWrapper); } @GetMapping ("delete") public boolean deleteUserByAge(@RequestParam("age") Integer age) { LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getAge,age); return userService.remove(queryWrapper); } @GetMapping("/{age}") public List<User> getUserByAge(@PathVariable Integer age) { LambdaQueryWrapper<User> 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 ServiceImpl<UserMapper, 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 BaseMapper<User> { }
啟動類
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); } }
測試
添加
修改
查詢
刪除
總結(jié)
這只是個(gè)簡單的入門示例,后續(xù)深入研究
到此這篇關(guān)于SpringBoot+Mybatis-plus+shardingsphere實(shí)現(xiàn)分庫分表的文章就介紹到這了,更多相關(guān)SpringBoot Mybatis-plus shardingsphere分庫分表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot+mybatis-plus實(shí)現(xiàn)自動建表的示例
- SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用
- SpringBoot中使用MyBatis-Plus實(shí)現(xiàn)分頁接口的詳細(xì)教程
- SpringBoot3.x版本與Mybatis-Plus不兼容問題
- springboot3集成mybatis-plus報(bào)sqlSession異常的問題解決
- SpringBoot整合Mybatis-Plus、Jwt實(shí)現(xiàn)登錄token設(shè)置
- springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問題
相關(guān)文章
Java中ReentrantLock和ReentrantReadWriteLock的原理
這篇文章主要介紹了Java中ReentrantLock和ReentrantReadWriteLock的原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09SpringBoot定時(shí)調(diào)度之Timer與Quartz詳解
Java?中常用的定時(shí)調(diào)度框架有以下幾種:Timer、ScheduledExecutorService、Spring?Task和Quartz,本文主要來和大家講講他們的具體使用,需要的可以參考一下2023-06-06idea熱部署插件jrebel正式版及破解版安裝詳細(xì)圖文教程
這篇文章主要介紹了idea熱部署插件jrebel正式版及破解版安裝詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12java 運(yùn)行報(bào)錯has been compiled by a more recent version of the J
java 運(yùn)行報(bào)錯has been compiled by a more recent version of the Java Runtime (class file version 54.0)2021-04-04springBoot連接遠(yuǎn)程Redis連接失敗的問題解決
本文主要介紹了springBoot連接遠(yuǎn)程Redis連接失敗的問題解決,使用springboot里面的redisTemplate進(jìn)行連接的時(shí)候,卻發(fā)生了報(bào)錯,下面就來一起解決一下2024-05-05springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過程(連接數(shù)據(jù)庫進(jìn)行測試)
這篇文章主要介紹了springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過程(連接數(shù)據(jù)庫進(jìn)行測試),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08