ShardingSphere(原名 Sharding-JDBC)是一个开源的分布式数据库中间件,它为Java应用提供了透明的数据库分片、读写分离、分布式事务等功能。在使用ShardingSphere时,应用不需要了解数据库分片的实现细节,它会自动将SQL请求路由到正确的数据库和表。
以下是一个简单的ShardingSphere-JDBC实例讲解,展示如何在Java项目中配置和使用Sharding-JDBC进行数据库分片。
1. 依赖配置
在项目的 pom.xml
中添加 Sharding-JDBC 的依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>5.0.0</version>
</dependency>
2. 配置 Sharding-JDBC
Sharding-JDBC 配置有两种方式:YAML 配置 和 Java 配置。下面我们使用 Java 配置方式来进行数据库分片配置。
配置数据源和分片规则
import org.apache.shardingsphere.api.ShardingDataSourceFactory;
import org.apache.shardingsphere.sharding.api.config.TableRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.InlineShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.NoneShardingStrategyConfiguration;
import org.apache.shardingsphere.jdbc.core.datasource.ShardingDataSource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public class ShardingJdbcExample {
public static void main(String[] args) throws Exception {
// 配置数据源
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("jdbc:mysql://localhost:3306/db_0", "root", "password"));
dataSourceMap.put("ds1", createDataSource("jdbc:mysql://localhost:3306/db_1", "root", "password"));
// 配置分片规则
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
// 配置表的分片规则
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration();
tableRuleConfig.setLogicTable("t_order"); // 逻辑表名
tableRuleConfig.setActualDataNodes("ds${0..1}.t_order${0..1}"); // 实际节点配置,表示在ds0、ds1上分别有t_order0、t_order1表
// 配置分片策略,按订单ID进行分片
tableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "ds${order_id % 2}"));
tableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
// 将表规则配置到分片规则中
shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
// 创建数据源
ShardingDataSource dataSource = (ShardingDataSource) ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig);
// 使用Sharding-JDBC的数据源进行操作
// 可以通过JDBC连接池或Spring集成的方式来获取连接并执行SQL查询
}
// 创建数据源的工具方法
private static DataSource createDataSource(String url, String username, String password) {
// 在实际开发中,可以使用连接池(如 HikariCP)来优化性能
return DataSourceBuilder.create()
.url(url)
.username(username)
.password(password)
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
}
}
3. 表结构设计
假设我们有一个表 t_order
,它包含如下字段:
CREATE TABLE t_order (
order_id INT NOT NULL,
user_id INT,
order_date DATE,
PRIMARY KEY (order_id)
);
为了演示分片,配置了 order_id
字段作为分片键。Sharding-JDBC 会根据 order_id
字段将数据路由到不同的数据库和表。
4. 分片规则配置
- 数据库分片:根据
order_id % 2
来决定将数据存储到哪个数据库(ds0
或ds1
)。
表分片:根据 order_id % 2
来决定将数据存储到哪张表(t_order0
或 t_order1
)。
ds0:
t_order0
t_order1
ds1:
t_order0
t_order1
5. 执行SQL操作
Sharding-JDBC 自动处理 SQL 的路由,所以在应用层你只需要像操作普通数据库一样执行 SQL 语句。例如,插入一条订单记录:
Connection connection = dataSource.getConnection();
PreparedStatement stmt = connection.prepareStatement("INSERT INTO t_order (order_id, user_id, order_date) VALUES (?, ?, ?)");
stmt.setInt(1, 1001); // order_id
stmt.setInt(2, 1); // user_id
stmt.setDate(3, Date.valueOf("2024-12-01")); // order_date
stmt.executeUpdate();
Sharding-JDBC 会根据 order_id
的值将数据插入到正确的数据库和表中。
6. Sharding-JDBC 支持的功能
- 数据源分片:将数据分布到不同的数据库。
- 表分片:将表中的数据拆分到多个表中。
- 读写分离:支持主从读写分离,在高并发读操作时将查询请求路由到从库。
- 分布式事务:Sharding-JDBC 提供了分布式事务的支持,保证跨库、跨表的事务一致性。
7. 高级配置
除了简单的分片和表策略,Sharding-JDBC 还支持更复杂的路由和事务管理,例如:
- ShardingSphere-JDBC 高级路由策略:可以实现更灵活的分片策略,如范围分片、哈希分片等。
- 分布式事务:支持 XA 和 TCC(分布式事务)等事务模式,确保数据一致性。
- SQL 解析和优化:Sharding-JDBC 会对 SQL 进行解析和优化,保证路由过程高效。
总结
Sharding-JDBC 是一个强大的分布式数据库中间件,通过简单的配置,可以轻松实现数据的分片、读写分离以及分布式事务等功能。它支持透明的数据库操作,让开发人员无需关心底层的数据库分片细节,从而提升系统的可扩展性和性能。
希望这个实例讲解能帮助你理解如何在 Java 项目中配置和使用 Sharding-JDBC。如果你有更复杂的需求,也可以深入了解 Sharding-JDBC 的高级特性和配置。