我这里只实现了静态分库,就是一开始就决定确定好有哪些数据库,和有哪些表要分库
1.配置文件
需要移除原本的数据库配置
加上shardingsphere
shardingsphere:
datasource:
names: ds0,ds1
ds0:
name: ds0
type: ${spring.datasource.type}
driverClassName: ${spring.datasource.driver-class-name}
filters: ${spring.datasource.filters}
maxActive: ${spring.datasource.maxActive}
validationQuery: ${spring.datasource.validationQuery}
url: jdbc:url?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: userName
password: password
ds1:
name: ds1
type: ${spring.datasource.type}
driverClassName: ${spring.datasource.driver-class-name}
filters: ${spring.datasource.filters}
maxActive: ${spring.datasource.maxActive}
validationQuery: ${spring.datasource.validationQuery}
url: jdbc:url2?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: userName
password: password
sharding:
defaultDataSourceName: ds0
defaultDatabaseStrategy:
standard:
shardingColumn: corp_code
preciseAlgorithmClassName: com.algorithm.DefaultDatabasePreciseShardingAlgorithm
rangeAlgorithmClassName: com..algorithm.DefaultDatabaseRangeShardingAlgorithm
tables:
trade:
actualDataNodes: ds${0..1}.trade
2.实现RangeShardingAlgorithm(即DefaultDatabaseRangeShardingAlgorithm)和PreciseShardingAlgorithm(即DefaultDatabasePreciseShardingAlgorithm)
根据规则(商户编号之类的),获取对应的库
3.修改启动类(卡着卡了半天)
修改@SpringBootApplication为@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
新增一下两个
@EnableConfigurationProperties(DruidStatProperties.class)
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class})
其实就是移除
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
不去校验单库的配置了
以上实现,基本可以完成静态分库
ID生成
虽然分库了,但是还是像表的ID不重复,需要实现ID生成
网上规则较多,我使用的是数据库+redis缓存模式
首先,我这里不完全相信redis持久化,所以需要再redis重启之后依然可以实现
1.分段,比如1000个ID分段一次
使用redssion的RAtomicLong
在重启或者分段结束之后,查库重新拿分段
所以判断按(i%1000==1)判断
拿分段之后,ID生成表值+1000
如果对缓存足够信任,分段可以长一点
注意,操作要加锁,如果没有锁,比如一个拿到10001,一个拿到10002,10002以为是正常,实际可能有重复的了



