Apache ShardingSphere-JDBC 数据源配置(Data Source)

以下是针对 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
driverClassNameJDBC 驱动类名com.mysql.cj.jdbc.Driver
jdbcUrl数据库连接 URLjdbc: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 模式下数据源动态管理

推送配置
新增数据源
删除数据源
修改密码
注册中心
ShardingSphere-Proxy
配置变更
动态加载新连接池
优雅关闭连接
重建连接池

注意:数据源变更后需验证:

  1. 连接池是否按预期重建
  2. 业务事务是否受影响

六、完整配置示例(主从分库)

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

关键总结

  1. 数据源命名需清晰体现角色(如 master_zone1, replica_west
  2. 生产环境必须加密密码 + 用 Cluster 模式动态管理
  3. 读写分离与分片数据源通过逻辑名称解耦
  4. 连接池参数根据数据库负载动态调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值