~码铃薯~

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ShardingSphere-JDBC

ShardingSphere-JDBC 是一个轻量级的 Java 框架,它作为增强版的 JDBC 驱动嵌入到你的应用中,让你像操作单库单表一样操作分库分表后的数据,对业务代码几乎无侵入。

🧩 核心概念速览

在动手配置前,先理解几个关键术语:

  • 逻辑表 (Logic Table):你代码中使用的“表名”,比如 t_order,是拆分后所有真实表的总称。
  • 真实表 (Actual Table):数据库中实际存在的物理表,例如 t_order_0t_order_1
  • 数据节点 (Data Node):分片的最小单元,由数据源名称和真实表组成,如 ds0.t_order_0
  • 分片键 (Sharding Column):用于决定数据路由到哪个库或表的字段,例如 user_idorder_id
  • 分片算法 (Sharding Algorithm):根据分片键的值计算出目标数据节点的规则,如取模、哈希等。

🚀 快速入门实操

我们以一个经典的“2库2表”场景为例:根据 user_id 取模分库,根据 order_id 取模分表。

1. 环境与依赖准备

确保你的项目环境为 JDK 17+Spring Boot 3.xMySQL 8.0+

pom.xml 中引入核心 Starter 依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.3.2</version> <!-- 建议使用5.3.x稳定版 -->
</dependency>

2. 数据库准备

你需要提前创建好物理库和表。在这个例子里,你需要创建 ds0ds1 两个数据库,并在每个库中分别创建 t_order_0t_order_1 两张结构相同的表。

3. 核心配置 (application.yml)

这是最关键的一步,配置真实数据源、分片规则和算法。

spring:
  shardingsphere:
    # 1. 配置真实数据源
    datasource:
      names: ds0,ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false
        username: root
        password: your_password
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC&useSSL=false
        username: root
        password: your_password

    # 2. 配置分片规则
    rules:
      sharding:
        tables:
          t_order: # 逻辑表名
            actual-data-nodes: ds${0..1}.t_order_${0..1} # 数据节点分布
            database-strategy: # 分库策略
              standard:
                sharding-column: user_id
                sharding-algorithm-name: database-inline
            table-strategy: # 分表策略
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table-inline
            key-generate-strategy: # 分布式主键策略
              column: order_id
              key-generator-name: snowflake
        # 3. 配置分片算法
        sharding-algorithms:
          database-inline:
            type: INLINE
            props:
              algorithm-expression: ds${user_id % 2} # user_id取模2决定库
          table-inline:
            type: INLINE
            props:
              algorithm-expression: t_order_${order_id % 2} # order_id取模2决定表
        key-generators:
          snowflake:
            type: SNOWFLAKE

配置说明:actual-data-nodes 定义了数据分布;database-strategytable-strategy 分别指定了分库和分表使用的分片键与算法名称;sharding-algorithms 则用 INLINE 类型的内联表达式实现了简单的取模逻辑。

4. 业务代码编写

配置完成后,你的业务代码不需要任何改动。注入普通的 DataSource,照常使用 JdbcTemplate 或 MyBatis 即可。ShardingSphere 会在 JDBC 层自动拦截 SQL,完成路由和结果合并。

@Service
public class OrderService {
    @Autowired
    private JdbcTemplate jdbcTemplate; // 或注入你的 MyBatis Mapper

    public void createOrder(Long userId, Long orderId) {
        // 你写的还是针对逻辑表 t_order 的普通SQL
        String sql = "INSERT INTO t_order (order_id, user_id, price) VALUES (?, ?, ?)";
        // 框架会自动根据 user_id 和 order_id 路由到正确的库和表
        jdbcTemplate.update(sql, orderId, userId, 99.9);
    }
}

⚠️ 重要注意事项

  • 分片键必须出现在 SQL 的 WHERE 条件中:否则框架无法路由,会执行全库全表路由,性能极差。
  • 分布式主键:分表后数据库自增主键会冲突,必须配置 key-generate-strategy(如 SNOWFLAKE)来生成全局唯一 ID。
  • 事务支持:默认仅支持本地事务。如果需要跨库事务,需要引入 XA 或 Seata 等分布式事务方案,但这会带来性能损耗。
  • DDL 操作ALTER TABLE 等 DDL 语句不会自动在所有真实表上执行,需要你手动在所有分片上操作。
  • 分页查询:跨多个数据节点的 LIMIT 分页,框架需要归并结果,在数据量很大时性能会下降,建议考虑使用基于 ID 的游标分页。
posted on 2026-09-14 16:55  ~码铃薯~  阅读(13)  评论(0)    收藏  举报