shardingsphere+mybatis不走自定义doSharding方法原因

通过DEBUG源码发现
当mybatis采用@Param(“dataType”)时 源码中StandardShardingStrategy的doSharding方法的shardingValue参数为空 导致无法执行doSharding方法,个人猜测是因为@Param(“dataType”)注解方式将参数某种原因覆盖为空的
在这里插入图片描述
在这里插入图片描述
解决 去掉@Param(“dataType”)注解解决
在这里插入图片描述
这个问题是个大坑 恶心我两天,终于解决了 希望遇到的朋友能看到解决,有心思看源码的希望告知具体原因

### 整合 Spring MyBatis 和 Sharding-JDBC 实现分库分表 #### 背景介绍 随着业务规模的扩大,单一数据库架构无法满足高性能和大容量的需求。通过引入分库分表技术,可以有效缓解这些问题。Sharding-JDBC 是 Apache ShardingSphere 生态系统中的一个重要组件,它仅支持透明化 SQL 解析与改写,还兼容多种主流框架,如 Spring Boot 和 MyBatis。 以下是整合 Spring、MyBatis 和 Sharding-JDBC 的实现方法: --- #### 1. 添加依赖项 在 Maven 或 Gradle 中添加必要的依赖项,包括 Spring Boot、MyBatis 和 Sharding-JDBC 的相关包。 ```xml <!-- Sharding-JDBC Core --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId> <version>5.1.2</version> </dependency> <!-- MyBatis-Spring-Boot-Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> <!-- 数据库驱动 (以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 上述配置中包含了 Sharding-JDBC 核心模块以及 MyBatis 集成所需的 Starter[^1]。 --- #### 2. 配置数据源 定义多个数据源用于分库操作,并指定逻辑表名及其实际物理分布规则。 ##### application.yml 示例 ```yaml spring: shardingsphere: datasource: names: ds_0,ds_1 ds_0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_0?useSSL=false&serverTimezone=UTC username: root password: root ds_1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_1?useSSL=false&serverTimezone=UTC username: root password: root rules: sharding: tables: t_order: actual-data-nodes: ds_${0..1}.t_order_${0..1} table-strategy: standard: sharding-column: order_id precise-algorithm-class-name: com.example.demo.algorithm.PreciseModuloAlgorithm key-generate-strategy: column: order_id type: SNOWFLAKE ``` 此部分配置指定了两个数据源 `ds_0` 和 `ds_1`,并设置了基于订单 ID (`order_id`) 进行取模运算的分片算法[^2]。 --- #### 3. 编写自定义分片算法 创建一个类来实现具体的分片逻辑,例如按主键取模分配至同表或库。 ```java package com.example.demo.algorithm; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; import java.util.Collection; public class PreciseModuloAlgorithm implements PreciseShardingAlgorithm<Long> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) { long value = shardingValue.getValue(); int targetIndex = Math.abs((int)(value % availableTargetNames.size())); return availableTargetNames.stream().skip(targetIndex).findFirst().orElse(null); } } ``` 该算法实现了精确分片接口,按照传入值对目标集合大小取模决定最终归属位置[^3]。 --- #### 4. 使用 MyBatis 定义 Mapper 接口 编写标准的 MyBatis 映射文件或者注解形式的操作层代码即可正常调用已配置好的分布式环境。 示例 Mapper 文件如下所示: ```xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.OrderMapper"> <!-- 查询所有记录 --> <select id="selectAllOrders" resultType="Order"> SELECT * FROM t_order </select> <!-- 插入新纪录 --> <insert id="insertOrder" parameterType="Order"> INSERT INTO t_order(order_id, user_id, status) VALUES(#{orderId}, #{userId}, #{status}) </insert> </mapper> ``` 注意无需手动拼接动态表名或其他复杂处理,因为这些工作由 Sharding-JDBC 自动完成。 --- #### 5. 测试验证 启动应用程序后执行 CRUD 操作测试其正确性和性能表现。确认各条目被合理分流到预期的目标节点之上。 --- ### 注意事项 - **事务管理**:由于涉及跨库操作,默认隔离级别可能导致一致性问题;建议启用柔性事务机制(如 TCC)保障全局可靠性。 - **索引优化**:针对高频访问字段建立合适索引来加速检索速度。 - **监控运维**:定期检查慢查询日志及资源消耗情况以便及时调整策略参数设置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值