栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

分库案例及ID生成规则

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分库案例及ID生成规则

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/843025.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号