以下是针对 Apache ShardingSphere-JDBC 数据源配置(Data Source) 的深度解析,结合 官方文档 的核心要点与实战经验:
一、数据源配置的核心作用
dataSources: # 定义所有真实数据库连接
primary_ds: # 数据源名称(逻辑标识)
dataSourceClassName: com.zaxxer.hikari.HikariDataSource # 连接池类型
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://db-primary:3306/db?useSSL=false
username: admin
password: S3cr3tP@ss
replica_ds_0:
... # 类似配置
功能定位:
声明 ShardingSphere-JDBC 底层连接的真实数据库实例,支持:
- 多类型数据库(MySQL, PostgreSQL, Oracle 等)
- 多连接池(HikariCP, Druid, DBCP 等)
- 主从架构、多副本读写分离
二、配置项深度解析
1. 基础参数(必填)
参数 | 说明 | 示例值 |
---|---|---|
dataSourceClassName | 连接池全限定类名(推荐显式声明) | com.zaxxer.hikari.HikariDataSource |
driverClassName | JDBC 驱动类名 | com.mysql.cj.jdbc.Driver |
jdbcUrl | 数据库连接 URL | jdbc:mysql://host:3306/db_name |
username | 数据库用户名 | admin |
password | 数据库密码(强烈建议加密) | ENC(密文) |
2. 连接池专属参数(按需)
primary_ds:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
# HikariCP 专属参数
connectionTimeout: 30000 # 连接超时(ms)
idleTimeout: 600000 # 空闲连接存活时间(ms)
maxLifetime: 1800000 # 连接最大存活时间(ms)
maximumPoolSize: 50 # 最大连接数
minimumIdle: 10 # 最小空闲连接
3. **多数据源类型示例
Druid 连接池配置:
replica_ds_0:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://replica1:3306/db # Druid 使用 url 而非 jdbcUrl
initialSize: 5
minIdle: 5
maxActive: 20
filters: stat,wall # 启用监控统计和防御SQL注入
Oracle 数据库配置:
oracle_ds:
dataSourceClassName: oracle.ucp.jdbc.PoolDataSourceImpl
connectionFactoryClassName: oracle.jdbc.pool.OracleDataSource
url: jdbc:oracle:thin:@//host:1521/service_name
user: system
password: oracle_pwd
三、生产环境最佳实践
1. 密码加密(避免明文暴露)
primary_ds:
password: ENC(AES:AdDq3/4sdfsdfFASDf5e6Q==) # 使用ShardingSphere内置加密
# 在 rules 中配置加解密规则
rules:
- !ENCRYPT
encryptors:
aes_encryptor:
type: AES
props:
aes-key-value: 123456abc
tables:
# 此处加密表字段,但数据源密码加密需单独配置
替代方案:
- 集成 Vault / KMS 等密钥管理系统
- 使用 Jasypt 等外部加密库预处理配置
2. 读写分离数据源分组
dataSources:
# 写库 (主库)
primary_write:
jdbcUrl: jdbc:mysql://master:3306/db
# 读库集群 (从库)
replica_0:
jdbcUrl: jdbc:mysql://slave0:3306/db
replica_1:
jdbcUrl: jdbc:mysql://slave1:3306/db
# 在读写分离规则中引用
rules:
- !READWRITE_SPLITTING
dataSources:
pr_ds: # 逻辑数据源名称
writeDataSourceName: primary_write
readDataSourceNames:
- replica_0
- replica_1
3. 分库分表数据源映射
dataSources:
ds_0: # 分片数据库0
url: jdbc:mysql://db-host-0:3306/shard_db_0
ds_1: # 分片数据库1
url: jdbc:mysql://db-host-1:3306/shard_db_1
rules:
- !SHARDING
tables:
orders:
actualDataNodes: ds_${0..1}.orders_${0..7} # 指向 ds_0, ds_1
四、高级技巧与避坑指南
1. 连接池参数调优公式
# HikariCP 生产推荐值 (基于 4核CPU/16GB内存)
maximumPoolSize: ${2 * cpu_cores + 1} # 通常 8-20
minimumIdle: ${maximumPoolSize / 2} # 避免突发流量
connectionTimeout: 3000 # 快速失败
maxLifetime: 1800000 # 30分钟(避免数据库防火墙断开)
2. 多数据库类型混配
需确保不同数据库的分片算法兼容性(如 MySQL 的
LIMIT
和 Oracle 的ROWNUM
)
dataSources:
mysql_ds:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://mysql-host:3306/db
pg_ds:
dataSourceClassName: org.postgresql.ds.PGSimpleDataSource
jdbcUrl: jdbc:postgresql://pg-host:5432/db
# 分片规则中需使用通用SQL(或适配方言)
3. 故障转移与健康检查
# Druid 连接保活配置(防防火墙断开)
replica_ds_0:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
validationQuery: SELECT 1 FROM DUAL # MySQL 心跳语句
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
五、与模式配置(Mode)的联动
Cluster 模式下数据源动态管理:
注意:数据源变更后需验证:
- 连接池是否按预期重建
- 业务事务是否受影响
六、完整配置示例(主从分库)
dataSources:
# 主库 (分片0)
master_ds_0:
dataSourceClassName: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://master0:3306/db0
username: admin
password: ENC(AES:xxx)
maximumPoolSize: 15
# 主库 (分片1)
master_ds_1:
...
# 从库集群 (分片0)
slave_ds_0_0:
jdbcUrl: jdbc:mysql://slave0-0:3306/db0
slave_ds_0_1:
...
# 从库集群 (分片1)
slave_ds_1_0:
...
rules:
- !SHARDING
tables:
user:
actualDataNodes: ms_ds_${0..1}.user # 指向逻辑数据源
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: db_hash
- !READWRITE_SPLITTING
dataSources:
ms_ds_0: # 逻辑数据源 (分片0)
writeDataSourceName: master_ds_0
readDataSourceNames:
- slave_ds_0_0
- slave_ds_0_1
ms_ds_1: ... # 分片1配置
mode:
type: Cluster
repository:
type: Nacos
props:
server-lists: nacos-cluster:8848
namespace: PROD_SHARD_01
关键总结:
- 数据源命名需清晰体现角色(如
master_zone1
,replica_west
) - 生产环境必须加密密码 + 用 Cluster 模式动态管理
- 读写分离与分片数据源通过逻辑名称解耦
- 连接池参数根据数据库负载动态调整