Sharding-JDBC 入门教程
2025/8/15大约 4 分钟
Sharding-JDBC 入门教程
前置知识
在开始本教程之前,建议您具备以下基础知识:
- Java 基础语法
- Maven 或 Gradle 构建工具
- Spring Boot 基础
- MySQL 数据库基础
什么是 Sharding-JDBC?
Sharding-JDBC 是一个开源的分布式数据库中间件解决方案。它在 Java 的 JDBC 层提供的额外服务,可以透明化数据库分库分表访问。主要功能包括:
- 数据分片:将数据分散存储到多个数据库或表中
- 读写分离:支持主从数据库读写分离
- 分布式事务:支持跨库事务
- 数据库治理:支持配置中心、注册中心等
- 数据加密:支持数据加密存储
核心特性
- 无侵入:对业务代码零侵入,可以像使用普通数据源一样使用它
- 性能优先:基于 Hint 的分片策略,性能最大化
- 分布式事务:支持 XA 和柔性事务
- 生态兼容:支持任何实现 JDBC 规范的数据库
环境准备
1. 添加依赖
在您的 pom.xml
中添加 Sharding-JDBC 相关依赖:
<dependencies>
<!-- Sharding-JDBC 核心依赖 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.3.2</version>
</dependency>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
2. 数据库准备
创建两个数据库用于演示:
-- 创建数据库
CREATE DATABASE demo_ds_0;
CREATE DATABASE demo_ds_1;
-- 在每个数据库中创建表
CREATE TABLE t_order (
order_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
status VARCHAR(50)
);
快速入门
1. 配置数据源
在 application.yml
中配置数据源和分片规则:
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/demo_ds_0
username: root
password: root
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_1
username: root
password: root
rules:
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order
database-strategy:
standard:
sharding-column: user_id
sharding-algorithm-name: database-inline
key-generate-strategy:
column: order_id
key-generator-name: snowflake
sharding-algorithms:
database-inline:
type: INLINE
props:
algorithm-expression: ds$->{user_id % 2}
key-generators:
snowflake:
type: SNOWFLAKE
props:
sql-show: true
2. 创建实体类
package com.example.demo.entity;
import lombok.Data;
@Data
public class Order {
private Long orderId;
private Long userId;
private String status;
}
3. 创建 Repository
package com.example.demo.repository;
import com.example.demo.entity.Order;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface OrderRepository {
@Insert("INSERT INTO t_order(order_id, user_id, status) VALUES(#{orderId}, #{userId}, #{status})")
void insert(Order order);
@Select("SELECT * FROM t_order WHERE order_id = #{orderId}")
Order findById(Long orderId);
}
4. 测试示例
package com.example.demo;
import com.example.demo.entity.Order;
import com.example.demo.repository.OrderRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ShardingTest {
@Autowired
private OrderRepository orderRepository;
@Test
public void testInsert() {
Order order = new Order();
order.setUserId(1L);
order.setStatus("NEW");
orderRepository.insert(order);
Order found = orderRepository.findById(order.getOrderId());
System.out.println("Found order: " + found);
}
}
分片策略
Sharding-JDBC 支持多种分片策略:
- 标准分片:单一分片键的分片策略
- 复合分片:多分片键的分片策略
- Hint分片:强制分片路由
- 不分片:不分片的策略
分片算法
常用的分片算法包括:
- INLINE:使用 Groovy 表达式分片
- HASH_MOD:基于哈希取模
- RANGE:范围分片
- TIME_UNIT:时间范围分片
最佳实践
注意事项
- 分片键选择:选择分片键时要考虑业务场景和查询需求
- 分片算法:根据数据分布特点选择合适的分片算法
- 分片数量:合理规划分片数量,避免过度分片
- 数据均衡:确保数据在各分片中分布均匀
性能优化
- 连接池配置:合理配置数据库连接池参数
- SQL优化:避免使用跨库的关联查询
- 批量操作:使用批量插入提高性能
常见问题
1. 分片键如何选择?
选择分片键需要考虑以下因素:
- 数据分布是否均匀
- 是否经常用于查询条件
- 是否有关联查询需求
- 是否有排序需求
2. 如何处理分布式事务?
Sharding-JDBC 提供了两种事务类型:
- XA 事务:强一致性,性能较低
- BASE 事务:最终一致性,性能较好
根据业务场景选择合适的事务类型。
总结
本教程详细介绍了 Sharding-JDBC 的基础知识,包括:
- ✅ 基本概念:什么是 Sharding-JDBC 及其核心特性
- ✅ 环境准备:依赖配置和数据库准备
- ✅ 快速入门:基本配置和使用示例
- ✅ 分片策略:常用的分片策略和算法
- ✅ 最佳实践:使用注意事项和优化建议
下一步学习
- 学习 Sharding-JDBC 的读写分离配置
- 了解分布式事务的实现
- 探索数据加密等高级特性
希望这个教程对您有所帮助!如果您有任何问题,欢迎在评论区讨论。