ShardingSphere-JDBC 快速入门

ShardingSphere-JDBC 快速入门

作为轻量级 Java 驱动,ShardingSphere-JDBC 直接在应用层实现分库分表,无需独立代理服务。以下是核心实现步骤和关键配置:


一、环境准备
  1. 依赖配置 (Maven)
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>5.3.2</version> <!-- 使用最新稳定版 -->
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId> <!-- 连接池必备 -->
    <version>5.0.1</version>
</dependency>
  1. 数据库准备
    • 创建物理库:ds0, ds1
    • 每个库创建表:t_order_0, t_order_1

二、分片配置 (YAML 示例)
# config-sharding.yaml
dataSources:
  ds0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    jdbcUrl: jdbc:mysql://localhost:3306/ds0
    username: root
    password: root
  ds1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    jdbcUrl: jdbc:mysql://localhost:3306/ds1
    username: root
    password: root

rules:
- !SHARDING
  tables:
    t_order: # 逻辑表名
      actualDataNodes: ds${0..1}.t_order_${0..1} # 物理节点
      databaseStrategy: # 分库策略
        standard:
          shardingColumn: user_id
          shardingAlgorithmName: db_hash_mod
      tableStrategy: # 分表策略
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: table_mod
      keyGenerateStrategy: # 分布式ID
        column: order_id
        keyGeneratorName: snowflake

  shardingAlgorithms:
    db_hash_mod:
      type: HASH_MOD # 哈希取模
      props:
        sharding-count: 2 # 库数量
    table_mod:
      type: MOD # 简单取模
      props:
        sharding-count: 2 # 表数量
        
  keyGenerators:
    snowflake:
      type: SNOWFLAKE # 雪花算法

三、Java 代码集成
// 1. 加载配置创建数据源
DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(
    getFile("/config-sharding.yaml") 
);

// 2. 执行SQL (自动路由)
try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement("INSERT INTO t_order (user_id, status) VALUES (?, ?)")) {
    
    // 写入数据 (自动计算分片位置)
    ps.setLong(1, 123L); // user_id=123 → ds1 (123%2=1)
    ps.setString(2, "PAID"); 
    ps.executeUpdate();
}

// 3. 精确查询
try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM t_order WHERE order_id=?")) {
    ps.setLong(1, 6354827365123456789L); // 根据雪花ID路由
    ResultSet rs = ps.executeQuery();
    // 结果自动聚合
}

四、关键机制解析
  1. SQL 解析与路由

    • 解析 SQL 提取分片键值
    • 根据算法计算库表位置:库索引 = user_id % 2, 表索引 = order_id % 2
  2. 分布式主键生成

    // 显式获取分布式ID
    KeyGenerator keyGenerator = new SnowflakeKeyGenerator();
    Number orderId = keyGenerator.generateKey(); // 6354827365123456789
    
  3. 绑定表配置 (避免笛卡尔积)

    bindingTables:
      - t_order, t_order_item # 关联表使用相同分片键
    

五、调试技巧
  1. 开启 SQL 日志
# logback.xml
<logger name="org.apache.shardingsphere" level="DEBUG" />
  1. 日志解读示例
[INFO ] ShardingSphere-SQL - Logic SQL: SELECT * FROM t_order 
[INFO ] ShardingSphere-SQL - Actual SQL: ds1 ::: SELECT * FROM t_order_1 
[INFO ] ShardingSphere-SQL - Actual SQL: ds0 ::: SELECT * FROM t_order_0

六、生产注意事项
  1. 连接池配置

    dataSources:
      ds0:
        connectionTimeoutMilliseconds: 30000
        maxPoolSize: 50 # 按分库数量调整
    
  2. 分片键限制

    • WHERE 条件必须包含分片键
    • 跨库查询需使用逻辑表名
  3. 事务管理

    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
       return new DataSourceTransactionManager(dataSource); // 使用Spring事务
    }
    

七、完整项目结构
src/main/java
  ├── config
  │    └── ShardingConfig.java # YAML加载
  ├── entity
  │    └── Order.java # 实体类
  ├── repository
  │    └── OrderRepository.java # DAO层
  └── Application.java # SpringBoot入口
resources
  ├── config-sharding.yaml # 分片配置
  └── application.properties

最佳实践:使用 ShardingSphere Spring Boot Starter 可简化配置,直接通过 application.properties 加载规则。

通过此快速入门,您已掌握 ShardingSphere-JDBC 的核心配置和集成方法,下一步可深入探索分布式事务数据加密等高级特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值