1. 程式人生 > >分庫分表中間件sharding-jdbc的使用

分庫分表中間件sharding-jdbc的使用

關系 java高級 減少 壓力 連接 提前 ofo 水平拆分 指定

數據分片產生的背景,可以查看https://shardingsphere.apache.org/document/current/cn/features/sharding/,包括了垂直拆分和水平拆分的概念.還有這個框架的目標是什麽,都寫得很清楚

Sharding-JDBC與MyCat:

解決分庫分表的中間件.
但是定位不同,Sharding-JDBC定位是輕量級Java框架,以jar包的方式提供服務,未使用中間件,使用代碼連接庫.MyCat相當於代理,MyCat相當於數據庫,直接訪問MyCat就可以,不需要關系庫和表,MyCat自動處理,但是需要維護MyCat,性能會有損耗.
Sharding-JDBC(1.x):

github地址: https://github.com/apache/incubator-shardingsphere/releases
官網: https://shardingsphere.incubator.apache.org/
文檔: https://shardingsphere.apache.org/document/current/en/overview/
技術分享圖片
使用Sharding-JDBC進行讀寫分離實戰

在數據庫的操作中,寫操作是非常耗時的,而最常用的是讀操作,讀寫分離的目的是避免數據庫的寫操作影響讀操作的效率.最重要的目的還是減少數據庫的壓力,提高性能.

這只是模仿讀寫分析實戰,流程是創建兩個數據庫,配置兩個數據源,一個是主表,一個是從表,寫修改刪除在主表,查詢是在從表.

創建數據庫的語句:
技術分享圖片
創建項目,引入依賴
技術分享圖片
配置文件的編寫(使用xml的方式來實現):
技術分享圖片
編寫model,service,controller
技術分享圖片技術分享圖片
啟動類:
技術分享圖片
在查詢前使用這句可以指定從主庫中進行讀取數據.

分片算法參考:
https://blog.csdn.net/gjx8010/article/details/72542207#1-%E5%88%86%E7%89%87%E6%9E%9A%E4%B8%BE

分片枚舉: 通過在配置文件中配置可能的枚舉id,自己配置分片。 這種規則適用於特定的場景,比如有些業務需要按照省份或區縣來做保存,而全國的省份區縣固定的,這類業務使用這一規則。
範圍約定: 此分片適用於提前規劃好分片字段某個範圍屬於哪個分片. 這個接觸過,就是比如說id在1~10000的在一張表,10001~20000在另一張表.

取模: 比如說兩張表,奇數存一張表,偶數存一張表.
按日期進行分片: 比如說一天一張表,或者一個月一張表(這個一般是看業務需求).
還有很多,不過我覺得我比較喜歡的就這幾個,Hash的也很常用,只是我沒有用過.真正用過的就是範圍約定了.

分庫分表

分庫分表就是表面上的意思,將一個庫分為多個庫,講一個表分為多個表.

單庫分表
在前一個項目上進行修改
首先創建數據庫ds_03,在數據庫中創建4張表
技術分享圖片
重新創建xml文件sharding-table.xml:
技術分享圖片
上面在使用分表的時候使用的是inline表達式.還有一種自定義表達式,上面是註釋掉的,使用的是類來進行分表,但是我測試過程一直是類型轉換異常,Integer轉不成Long,這個錯誤清除,不知道發生在哪,因為著急,就不仔細研究了,下面把自定義表達式的類貼出來,有興趣的可以試試.
技術分享圖片
編寫controller
技術分享圖片
分庫分表
前面說了單庫分表,那分庫分表呢?一樣的實現.

創建數據庫和表
技術分享圖片
創建sharding-db-table.xml
技術分享圖片
技術分享圖片
添加數據庫的分庫策略
技術分享圖片
修改controller中的saves方法,進行測試:
技術分享圖片
分布式主鍵的使用
為了保證插入的主鍵不重復,所以使用分布式主鍵,其實在前面的xml中已經添加了實現<rdb:generate-key-column column-name="id"/>,接下來只要修改saves方法和save方法的實現就可以,也就是不給id賦值,並且插入的時候不給id字段,不過我在實踐過程中發現生成的id全是偶數,不知道是不是偶然,如果不是,那麽就需要重新找算法或者重新寫分配策略了.
歡迎工作一到五年的Java工程師朋友們加入Java高級互聯網架構:957734884,歡迎加入我們,給你意想不到的驚喜。

分庫分表中間件sharding-jdbc的使用