使用sharding-jdbc做分庫分表記錄
項目中要使用分庫分表來解決上億數據的存儲以及查詢問題,最開始使用的是硬編碼的方式,根據用戶id的hash值做分表,保證同一個用戶落在一張表里面。后面有同事說 使用shardingsphere有現成的解決方案,于是轉成了使用shardingsphere。
首先引入shardingjdbc的pom依賴
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.1</version>
</dependency>
版本比較低,主要是其他項目使用的是這個版本。
yaml配置:
server: port: 8166 spring: #多數據源 uc以及community 僅僅適用于數據同步腳本 datasource: dynamic: #設置嚴格模式,默認false不啟動. 啟動后在未匹配到指定數據源時候回拋出異常,不啟動會使用默認數據源. strict: true primary: super_community datasource: orapickup_uc: url: url username: username password: password driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource super_community: url: url_1 username: username1 password: password1 driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource orapickup_community: url: url2 username: username2 password: password2 driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 配置Sharding-JDBC讀寫分離規則 shardingsphere: # 指定數據源 dataSource: names: master,slave # 一主一從 # 配置主庫數據源 master: # 必須跟上面names對應 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: url_master username: username_master password: password_master # 配置從庫數據源 slave: # 必須跟上面names對應 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: url_read username: username_read password: password_read props: sql: show: true # 開啟SQL顯示,默認false sharding: # 默認數據源 default-data-source-name: master #讀寫分離 注意 分庫分表的讀寫分離和非分庫分表讀寫分離不同 master-slave-rules: # 在使用數據分片功能情況下,配置讀寫分離功能 master: # 自定義一個虛擬數據源名字,用于自動路由下方主從數據源 masterDataSourceName: master # 指定主數據源 slaveDataSourceNames: slave # 指定從數據源 loadBalanceAlgorithmType: round_robin tables: bbs_collect: #收藏表根據用戶id分100張表 actualDataNodes: master.bbs_collect_$->{1..100} tableStrategy: inline: shardingColumn: create_by #shardingColumn: is_enable #分表規則:createBy hash后取模 algorithmExpression: bbs_collect_$->{Math.abs(create_by.hashCode())%100 + 1} bbs_like: #真實表#分100張表 actualDataNodes: master.bbs_like_$->{1..100} tableStrategy: inline: shardingColumn: create_by #shardingColumn: is_enable #分表規則:createBy hash后取模 algorithmExpression: bbs_like_$->{Math.abs(create_by.hashCode())%100 + 1} application: name: gwm-community-interactive-server jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 servlet: multipart: maxFileSize: 5MB maxRequestSize: 500MB gwm: mq: topics: bbsLikeTopics: bbslike-dev rocketmq: name-server: 127.0.0.1:9876 producer: group: marketing-interactive-dev
中間遇到的幾個問題,首先是 分庫分表和讀寫分離的配置問題。由于另外一個項目使用的是讀寫分離+多數據源,我使用了他們的那個配置,發現不行。分庫分表和讀寫分離共用的話,需要另外配置。參考:
https://blog.csdn.net/qq_33763772/article/details/137401086
第二個是 當項目使用了事務的時候,分庫分表會不生效。類似下面的格式會導致分庫分表失效
@Service("bbsCollectServiceImpl") @Transactional(propagation= Propagation.REQUIRED,rollbackFor = Exception.class) todo 使用事務會導致數據源切換失效 public class BbsCollectServiceImpl implements BbsCollectService { // }

浙公網安備 33010602011771號