日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案

發布時間:2025/3/17 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、項目結構

1、工程結構

2、模塊命名

shard-common-entity: 公共代碼塊 shard-open-inte: 開放接口管理 shard-eureka-7001: 注冊中心 shard-two-provider-8001: 8001 基于兩臺庫的服務 shard-three-provider-8002:8002 基于三臺庫的服務

3、代碼依賴結構

4、項目啟動順序

(1)shard-eureka-7001: 注冊中心 (2)shard-two-provider-8001: 8001 基于兩臺庫的服務 (3)shard-three-provider-8002:8002 基于三臺庫的服務

按照順序啟動,且等一個服務完全啟動后,在啟動下一個服務,不然可能遇到一些坑。

二、核心代碼塊

1、8001 服務提供一個對外服務

基于Feign的調用方式
作用:基于兩臺分庫分表的數據查詢接口。

import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import shard.jdbc.common.entity.TableOne; /*** shard-two-provider-8001* 對外開放接口*/ @FeignClient(value = "shard-provider-8001") public interface TwoOpenService {@RequestMapping("/selectOneByPhone/{phone}")TableOne selectOneByPhone(@PathVariable("phone") String phone) ; }

2、8002 服務提供一個對外服務

基于Feign的調用方式
作用:基于三臺分庫分表的數據存儲接口。

import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import shard.jdbc.common.entity.TableOne;/*** 數據遷移服務接口*/ @FeignClient(value = "shard-provider-8002") public interface MoveDataService {@RequestMapping("/moveData")Integer moveData (@RequestBody TableOne tableOne) ; }

3、基于8002服務數據查詢接口

查詢流程圖

代碼塊

/*** 8001 端口 :基于兩臺分庫分表策略的數據查詢接口*/ @Resource private TwoOpenService twoOpenService ; @Override public TableOne selectOneByPhone(String phone) {TableOne tableOne = tableOneMapper.selectOneByPhone(phone);if (tableOne != null){LOG.info("8002 === >> tableOne :"+tableOne);}// 8002 服務沒有查到數據if (tableOne == null){// 調用 8001 開放的查詢接口tableOne = twoOpenService.selectOneByPhone(phone) ;LOG.info("8001 === >> tableOne :"+tableOne);}return tableOne ; }

4、基于 8001 數據掃描遷移代碼

遷移流程圖

代碼塊

/*** 8002 端口開放的數據入庫接口*/ @Resource private MoveDataService moveDataService ; /*** 掃描,并遷移數據* 以 庫 db_2 的 table_one_1 表為例*/ @Override public void scanDataRun() {String sql = "SELECT id,phone,back_one backOne,back_two backTwo,back_three backThree FROM table_one_1" ;// dataTwoTemplate 對應的數據庫:ds_2List<TableOne> tableOneList = dataTwoTemplate.query(sql,new Object[]{},new BeanPropertyRowMapper<>(TableOne.class)) ;if (tableOneList != null && tableOneList.size()>0){int i = 0 ;for (TableOne tableOne : tableOneList) {String db_num = HashUtil.moveDb(tableOne.getPhone()) ;String tb_num = HashUtil.moveTable(tableOne.getPhone()) ;// 只演示向數據新加庫 ds_4 遷移的數據if (db_num.equals("ds_4")){i += 1 ;LOG.info("遷移總數數=>" + i + "=>庫位置=>"+db_num+"=>表位置=>"+tb_num+"=>數據:【"+tableOne+"】");// 掃描完成:執行新庫遷移和舊庫清理過程moveDataService.moveData(tableOne) ;// dataTwoTemplate.update("DELETE FROM table_one_1 WHERE id=? AND phone=?",tableOne.getId(),tableOne.getPhone());}}} }

三、演示執行流程

1、項目流程圖

2、測試執行流程

(1)、訪問8002 數據查詢端口

http://127.0.0.1:8002/selectOneByPhone/phone20 日志輸出: 8001 服務查詢到數據 8001 === >> tableOne :+{tableOne}

(2)、執行8001 數據掃描遷移

http://127.0.0.1:8001/scanData

(3)、再次訪問8002 數據查詢端口

http://127.0.0.1:8002/selectOneByPhone/phone20 日志輸出: 8002 服務查詢到數據 8002 === >> tableOne :+{tableOne}

四、源代碼

https://github.com/cicadasmile/cloud-shard-jdbc

關注公眾號號:【知了一笑】,持續更新

總結

以上是生活随笔為你收集整理的基于SpringCloud实现Shard-Jdbc的分库分表模式,数据库扩容方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。