sharding-jdbc+seata实现分库分表,多数据源整合和seata分布式事务

本文详述了使用sharding-jdbc与seata实现数据库的分库分表及分布式事务处理,通过整合到SpringBoot项目中,展示了从理论到实践的全过程。包括工程搭建、配置、执行流程解析及源码跟踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sharding-jdbc+seata实现分库分表和分布式事务

sharding-jdbc 的相关理论&使用文档参考官网(https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/

seata 的相关理论&使用文档参考官网(https://github.com/seata/seata

 

image

 

sharding-jdbc可以理解为增强版的驱动,用户可以通过对图中的蓝色部分类进行创建,然后向上使用黄色工厂来进行创建满足规则的jdbc驱动,实现分库分表和读写分离。

 

工程搭建

本文不引入注册中心等其他组件。

seata-server

参考:https://github.com/seata/seata-workshop

下载解压seata,这里不需要做任何配置修改,因为这里只针对分库分表且多数据源的项目进行分布式事务实现,整合到微服务不是重点。如有需要,参考官网改一下配置就行了。

启动seata-server:指定事务操作记录的存储模式为file

seata-server.sh -p 8091 -m file

 

 

整合到springboot项目

springboot项目地址https://github.com/yangzhouhu/shardingsphere-springboot  用得着的话点个star啊

不论是已有项目,还是新项目。除了引入jar依赖外,还需要引入几个配置文件,参考官网

image.png

参数说明可以参考https://seata.io/zh-cn/docs/user/configurations.html

 

 

sharding-jdbc在数据源创建时的流程

在配置好实际数据源后,调用ShardingDataSourceFactory.createDataSource()方法,流程是这样的

image.png

这里的shardingDataSourceNames初始化,会去掉master和slave的数据库名。

 

ShardingDataSource.java

image.png

注册了路由,sql改写,结果集处理器,会初始化对应的配置的引擎,然后初始化了sharing的运行时上下文shardingRuntimeContext

 

shardingRuntimeContext里边主要是缓存了datasourceMetaData,以及初始化了sharding的事务引擎信息。

image.png

他的顶级父类是个抽象类,有多数据源和单数据源两种实现,这里使用到了多数据源实现

image.png

shardingSphereMetaData里边主要是数据源信息和库信息

image.png

image.png

这里会初始化执行引擎和sqlparser引擎。

 

 

sharding-jdbc在执行insert语句调用时的流程

本项目使用的orm框架为mybatis,在mybatis的PreparedStatementHandler执行sql时,会调用PreparedStatement这个接口的excute()方法,这时,会调用到实现类ShardingPreparedStatement对PreparedStatement这个接口的具体实现(具体实现类的生成则是由AbstractShardingPreparedStatementAdapter来适配的)

ShardingPreparedStatement执行写的一个方法:

image.png

先清理干净prepareStatementExcutor,然后调用

BasePrepareEngine.prepare,根据路由规则来解析sql的逻辑表,以及参数信息,得到该路由映射的真实的库表信息,然后改写sql,然后初始化prepareStatementExcutor,执行prepareStatementExcutor的excute,操作数据库,返回结果集,然后清理结果集对象。

 

如果是查询操作

image.png

会多一步归并结果集的操作。

这个项目只是提供了简单的整合demo,有兴趣深入的可以跟下源码,或者根据业务场景来拓展其他使用。

springboot项目地址https://github.com/yangzhouhu/shardingsphere-springboot 用得着的话点个star啊

另一篇基于sharding-proxy和sharding-scaling不停服数据迁移可以看这里:https://blog.youkuaiyun.com/HTslide/article/details/108258562

 

<think>好的,我现在需要帮助用户了解如何将Sharding-JDBC与MyBatis集成,特别是结合MyBatis-Plus的最佳实践。首先,我需要回顾一下已有的参考资料,确保信息准确。 根据引用[3],Sharding-JDBC是一个轻量级的Java框架,作为JDBC的增强驱动,兼容ORM框架,包括MyBatis。引用[4][5]提到了具体的集成示例,特别是与MyBatis-Plus的结合。用户需要教程示例,所以应该分步骤说明,并给出代码示例。 首先,集成的基本步骤可能包括添加依赖、配置数据源分片规则、定义实体Mapper接口。需要确保用户正确配置application.properties或.yml文件,尤其是分库分表的策略。引用[5]中的代码示例显示了BookMapper如何继承BaseMapper,这符合MyBatis-Plus的使用方式。 接下来,分库分表的配置是关键部分。需要解释分片策略,比如标准分片策略,并给出具体的配置示例。可能需要提到分片算法的实现,如精确匹配范围查询的处理,这部分可能需要自定义类,如引用[5]中的TimeShardingAlgorithm。 然后,需要注意事务管理SQL兼容性。Sharding-JDBC分布式事务的支持有限,需要提醒用户可能需要的注意事项。此外,复杂的SQL可能需要调整,以确保分片键的正确使用。 最后,提供相关的问题可以帮助用户进一步探索,比如性能优化、分布式事务处理等。需要确保所有信息准确,并正确引用来源,比如引用[4][5]中的示例代码配置。 需要验证每一步是否符合最佳实践,例如是否推荐使用MyBatis-Plus的BaseMapper,以及分片算法的实现方式是否合理。同时,检查是否有遗漏的配置项,比如负载均衡规则或其他高级设置。确保用户能够按照步骤成功集成,并理解每个部分的作用。</think>以下是通过Spring Boot集成Sharding-JDBC与MyBatis-Plus实现分库分表的完整教程: ### 一、环境准备 1. 新建Spring Boot项目(2.7.x版本) 2. 引入依赖: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> ``` ### 二、核心配置 `application.yml` 配置示例: ```yaml spring: shardingsphere: datasource: names: ds0,ds1 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db0 username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db1 username: root password: root sharding: tables: book: actual-data-nodes: ds$->{0..1}.book_$->{0..1} table-strategy: standard: sharding-column: create_time precise-algorithm-class-name: com.example.config.TimeShardingAlgorithm key-generator: column: id type: SNOWFLAKE ``` ### 三、实体与Mapper实现 1. 实体类定义(引用[5]): ```java @Data @TableName("book") public class Book { @TableId(type = IdType.ASSIGN_ID) private Long id; private String title; private LocalDateTime createTime; } ``` 2. Mapper接口继承MyBatis-Plus基类(引用[5]): ```java public interface BookMapper extends BaseMapper<Book> {} ``` ### 四、分片算法实现 ```java public class TimeShardingAlgorithm implements PreciseShardingAlgorithm<LocalDateTime> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<LocalDateTime> shardingValue) { int year = shardingValue.getValue().getYear(); return "book_" + (year % 2); // 按年份奇偶分表 } } ``` ### 五、最佳实践建议 1. **分片键选择**:建议使用业务主键或时间字段,避免使用非分片键的频繁查询 2. **事务处理**:跨库事务建议使用Seata分布式事务解决方案[^4] 3. **SQL规范**: - 避免使用`UNION` - WHERE条件必须包含分片键 - 分页查询需配合`LIMIT`使用 ### 六、验证示例 ```java @RestController public class DemoController { @Autowired private BookMapper bookMapper; @PostMapping("/add") public void addBook(@RequestBody Book book) { bookMapper.insert(book); // 数据将自动路由到对应分表 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值