我这里只实现了静态分库,就是一开始就决定确定好有哪些数据库,和有哪些表要分库 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以为是正常,实际可能有重复的了
|