基本介绍
Sharding-JDBC 是一款轻量级的Java数据库中间件,定位为数据库分片解决方案。它工作在Java的JDBC层,为应用程序提供透明的分库分表服务。与传统的数据库中间件不同,Sharding-JDBC采用客户端直连数据库的架构,以Jar包形式提供服务,无需额外部署代理服务器,可理解为增强版的JDBC驱动。
核心特性
无侵入架构
- 纯Java实现:完全基于JDBC规范开发,不修改数据库协议
- 零部署依赖:只需引入Jar包即可使用,无需额外部署中间件
- 透明化分片:对业务代码完全透明,应用无需感知分片逻辑
兼容性支持
ORM框架兼容
- 全系列ORM支持:
- JPA/Hibernate:自动处理EntityManager映射
- MyBatis/MyBatis-Plus:无缝集成Mapper接口
- Spring JDBC:完美支持JdbcTemplate操作
- 原生JDBC:保持标准API使用方式
连接池兼容
- 主流连接池适配:
- 传统连接池:DBCP、C3P0、BoneCP
- 高性能连接池:Druid、HikariCP
数据库支持
- 多数据库适配:MySQL、Oracle、SQLServer、PostgreSQL等
应用场景
- 海量数据存储:单表数据量超过千万级别时的自动分表
- 高并发访问:通过分库分散数据库访问压力
- 读写分离:配合主从架构实现读写流量分离
- 分布式事务:支持跨分片的事务管理
技术实现
- SQL解析引擎:基于Antlr实现SQL语法解析
- 路由引擎:支持精确、范围、复合等多种分片策略
- 执行引擎:并行化执行跨库查询
- 结果归并:支持内存归并、流式归并等多种结果处理方式
核心入口API
ShardingDataSourceFactory
这是分库分表场景的核心工厂类,主要功能包括:
- 支持水平分库(按照数据库维度拆分)
- 支持水平分表(按照表维度拆分)
- 内置读写分离功能
- 典型使用场景:电商订单表按用户ID分库分表
MasterSlaveDataSourceFactory
这是读写分离专用工厂类,功能包括:
- 支持一主多从架构
- 自动路由写操作到主库,读操作到从库
- 典型使用场景:交易系统的读写分离
配置体系
ShardingRuleConfiguration
作为配置体系的根对象,可以包含0到N个TableRuleConfiguration,可以包含0到1个MasterSlaveRuleConfiguration。
TableRuleConfiguration
支持5种分片策略配置:
- StandardShardingStrategyConfiguration(标准分片)
- InlineShardingStrategyConfiguration(行表达式)
- ComplexShardingStrategyConfiguration(复合分片)
- HintShardingStrategyConfiguration(Hint分片)
- NoneShardingStrategyConfiguration(无分片)
初始化流程
- 配置信息解析阶段:读取外部配置文件,校验配置参数的完整性
- Configuration对象生成:将解析后的配置信息映射为内存中的Configuration对象
- 规则转换阶段:通过Factory机制进行转换
- 数据源封装阶段:创建实际物理DataSource的连接池
- 运行时准备阶段:初始化SQL解析引擎,加载分片算法实现类
- 操作执行阶段:通过封装的DataSource执行SQL
使用示例
引入依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${latest.release.version}</version>
</dependency>
完整示例代码
// 1. 配置真实数据源
Map<String, DataSource> dataSourceMap = new HashMap<>();
dataSourceMap.put("ds0", createDataSource("ds0"));
dataSourceMap.put("ds1", createDataSource("ds1"));
// 2. 配置分片规则
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());
// 3. 创建数据源
Properties props = new Properties();
props.setProperty("sql.show", "true");
DataSource dataSource = ShardingDataSourceFactory.createDataSource(
dataSourceMap,
shardingRuleConfig,
props
);
主要功能
数据分片:
- 分库、分表
- 读写分离
- 分片策略
- 分布式主键
分布式事务:
- 标准化的事务接口
- XA强一致性事务
- 柔性事务
数据库治理:
- 配置动态化
- 编排和治理
- 数据脱敏
- 可视化链路追踪