分库分表
Sharding-JDBC 相关说明请参考官方文档。
参考
引入如下依赖
注:将 ${zebra.version} 替换为使用的 Zebra 版本
配置样例
zebra.database.username[0]=sa
zebra.database.pwd[0]=password
zebra.database.dataSourceName[0]=ds0
zebra.database.url[1]=jdbc:sqlserver://ip:port;database= dbName02
zebra.database.username[1]=sa
zebra.database.dataSourceName[1]=ds1
zebra.database.shardingcfg.shardDs01.datasource.names=ds0,ds1
zebra.database.shardingcfg.shardDs01.basePackage=com.guosen.zebra.demo.sharding.dao
zebra.database.shardingcfg.shardDs01.sharding.tables.t_credit.actual-data-nodes=ds$->{0..1}.t_credit_$->{2019..2039}0$->{1..9},ds$->{0..1}.t_credit_$->{2019..2039}$->{10..12}
zebra.database.shardingcfg.shardDs01.sharding.tables.t_credit.database-strategy.inline.sharding-column=fund_id
zebra.database.shardingcfg.shardDs01.sharding.tables.t_credit.database-strategy.inline.algorithm-expression=ds$->{fund_id % 2}
zebra.database.shardingcfg.shardDs01.props.sql.show=true
如上图,上述配置项配置了一个逻辑表 t_credit 的分库分表规则。
三个关键的配置项说明如下:
zebra.database.shardingcfg.shardDs01.datasource.names
组成分库分表的原始数据源名称,一个到多个,以逗号分隔。
比如上述配置
ds0 对应数据源配置项 zebra.database.dataSourceName[0]=ds0 的值。
t_credit.database-strategy相关的配置项
配置了分库规则
t_credit.database-strategy.inline.algorithm-expression=ds$->{fund_id%2}表示根据 SQL 中的 fund_id 字段对 2 取模来确定该 SQL 要路由到哪个数据源对应的数据库执行。
比如 SQL
select * from t_credit where m_month = 201908 and fund_id = 8888
那么最后分库 SQL 会变为(仍和上面分表 SQL 一致)
路由到的数据源为ds$->{8888%2} = ds0,该 SQL 会被路由到 ds0 对应的数据库中执行。
t_credit.table-strategy 相关的配置项
配置了分表规则
tcredit.table-strategy.inline.algorithm-expression=t_credit$->{m_month} 表示根据SQL中 m_month 进行分表。
比如 SQL
select * from t_credit where m_month = 201908 and fund_id = 8888
配置说明
和 Sharding-JDBC 基本保持一致,但是配置前缀修改为 zebra.database.shardingcfg.${分库分表数据源名称}
关键配置项
代码开发和已有 Zebra 数据库开发方式保持一致。但是相关业务 SQL 必须带上分库分表字段,如果没有带,则 Sharding-JDBC 会扫描配置的所有表,速度很可能就非常慢。
参考官方文档 1. 不支持的sql 2.
下面仅列出 Zebra 开发验证时发现的问题。
如果使用的数据为 SQLServer,则应该注意如下问题。
分页
Sharding-JDBC 对 SQLServer 的分页支持不完整,官网宣称可以 2 种分页方式:TOP + ROWNUMBER和 OFFSET FETCH。经验证,2 种都有不同程度的 bug。 分页查询当前实际只支持 OFFSET FETCH 方式,必须同时带上包含了分表分库字段的 where 条件,若不带分库分表字段条件,则返回的数据可能会比实际的多。
已经在 GitHub 上面提了 issue