基本介绍

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等

应用场景

  1. 海量数据存储:单表数据量超过千万级别时的自动分表
  2. 高并发访问:通过分库分散数据库访问压力
  3. 读写分离:配合主从架构实现读写流量分离
  4. 分布式事务:支持跨分片的事务管理

技术实现

  • SQL解析引擎:基于Antlr实现SQL语法解析
  • 路由引擎:支持精确、范围、复合等多种分片策略
  • 执行引擎:并行化执行跨库查询
  • 结果归并:支持内存归并、流式归并等多种结果处理方式

核心入口API

ShardingDataSourceFactory

这是分库分表场景的核心工厂类,主要功能包括:

  • 支持水平分库(按照数据库维度拆分)
  • 支持水平分表(按照表维度拆分)
  • 内置读写分离功能
  • 典型使用场景:电商订单表按用户ID分库分表

MasterSlaveDataSourceFactory

这是读写分离专用工厂类,功能包括:

  • 支持一主多从架构
  • 自动路由写操作到主库,读操作到从库
  • 典型使用场景:交易系统的读写分离

配置体系

ShardingRuleConfiguration

作为配置体系的根对象,可以包含0到N个TableRuleConfiguration,可以包含0到1个MasterSlaveRuleConfiguration。

TableRuleConfiguration

支持5种分片策略配置:

  1. StandardShardingStrategyConfiguration(标准分片)
  2. InlineShardingStrategyConfiguration(行表达式)
  3. ComplexShardingStrategyConfiguration(复合分片)
  4. HintShardingStrategyConfiguration(Hint分片)
  5. NoneShardingStrategyConfiguration(无分片)

初始化流程

  1. 配置信息解析阶段:读取外部配置文件,校验配置参数的完整性
  2. Configuration对象生成:将解析后的配置信息映射为内存中的Configuration对象
  3. 规则转换阶段:通过Factory机制进行转换
  4. 数据源封装阶段:创建实际物理DataSource的连接池
  5. 运行时准备阶段:初始化SQL解析引擎,加载分片算法实现类
  6. 操作执行阶段:通过封装的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强一致性事务
  • 柔性事务

数据库治理

  • 配置动态化
  • 编排和治理
  • 数据脱敏
  • 可视化链路追踪