ShardingJDBC 是 Apache ShardingSphere 的一個子項目,它是一個開源的分庫分表中間件,提供了透明化的數據分片、分布式事務和數據庫治理等功能。ShardingJDBC 以 JDBC Driver 的形式提供,支持任何基于 JDBC 的 ORM 框架、持久層框架和數據庫連接池,具有高度兼容性。
1、添加依賴
<dependencies><!-- Mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!-- Mybatis Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency><!-- MyBatis-Plus Generator --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.5</version></dependency><!-- MySQL JDBC 驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!-- Druid 數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.20</version></dependency><!--shardingsphere--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.1</version></dependency><!-- shardingsphere和2.2不兼容,需要使用1.33,但是1.33和springboot 3.2.2 不兼容,所以自定義了 TagInspector和 UnTrustedTagInspector --><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency></dependencies>
主要是在 mysql、mybatis 等依賴的基礎上,增加shardingsphere-jdbc-core-spring-boot-starter的依賴。
這里為了解決一個版本兼容問題,增加了一個snakeyaml的依賴,一般來說其實是不用的。
2、添加配置
spring:shardingsphere:mode:type: Standalonerepository:type: JDBCprops:sql-show: truedatasource:names: dsds:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://rm-bp101vuh0edt82wo0go.mysql.rds.aliyuncs.com:3306/nfturbousername: nfturbopassword: 'NFTurbo666'# Druid連接池配置datasource.druid:initial-size: 5 # 連接池初始化時創建的連接數。默認值為0。min-idle: 5 # 連接池中保持的最小空閑連接數量。當連接池中的連接數量小于這個值時,連接池會嘗試創建新的連接。默認值為0。max-active: 20 # 連接池中允許的最大連接數。如果所有連接都被使用并且沒有空閑連接,新的連接請求將被阻塞,直到有連接可用。默認值為8。max-wait: 60000 # 獲取連接時的最大等待時間,單位為毫秒。如果在指定的時間內無法獲取到連接,將拋出異常。默認值為-1,表示無限等待。time-between-eviction-runs-millis: 60000 # 連接池每次檢測空閑連接的間隔時間,單位為毫秒。默認值為60000毫秒(1分鐘)。min-evictable-idle-time-millis: 300000 # 連接在連接池中的最小空閑時間,超過這個時間的連接將被回收,單位為毫秒。默認值為300000毫秒(5分鐘)。validation-query: SELECT 1 # 用于驗證連接是否有效的SQL查詢語句。Druid會定期執行此查詢來檢測連接的可用性。默認為"SELECT 1"。test-while-idle: true # 是否在連接空閑時檢測連接的有效性。如果設置為true,則連接池會定期檢測空閑連接,如果連接失效,將被標記為不可用并移除。默認為true。test-on-borrow: false # 是否在從連接池借用連接時檢測連接的有效性。如果設置為true,每次從連接池借用連接時都會執行連接有效性檢測。默認為false。test-on-return: false # 是否在歸還連接到連接池時檢測連接的有效性。如果設置為true,連接在歸還到連接池時會進行有效性檢測。默認為false。pool-prepared-statements: true # 是否開啟預處理語句池。預處理語句池可以提高性能,特別是在執行相同SQL語句多次時。默認為true。max-pool-prepared-statement-per-connection-size: 20 #每個連接上允許的最大預處理語句數。默認值為20。rules:sharding:tables:trade_order:actual-data-nodes: ds.trade_order_0${0..3}keyGenerateStrategy:column: idkeyGeneratorName: snowflaketable-strategy:standard:shardingColumn: buyer_idshardingAlgorithmName: t-order-inlineshardingAlgorithms:t-order-inline:type: INLINEprops:algorithm-expression: trade_order_0${Math.abs(buyer_id.hashCode()) % 4}keyGenerators:snowflake:type: SNOWFLAKEauditors:sharding_key_required_auditor:type: DML_SHARDING_CONDITIONS
以上是一個簡單的 demo,主要是 sharding 下面的這些配置是我們需要關注的,主要就是關于分庫分表的一致基本配置:
spring.shardingsphere:整體的配置的前綴
spring.shardingsphere.mode:運行模式,支持 memory、standalone 和 cluster 幾種,我們用的是比較簡單的standalone 這種配置
spring.shardingsphere.props.sql-show:配置為 ture 會把執行的 SQL 打印出來,方便排查問題
spring.shardingsphere.datasource:這就是數據源的配置了,所謂數據源就是你的數據庫
spring.shardingsphere.rules.sharding:這部分就是關于分表的一些配置了。
spring.shardingsphere.rules.sharding.tables:這部分開始配置分表信息,每一個需要做分庫分表的表都需要單獨配置一套
spring.shardingsphere.rules.sharding.tables.trade_order:表示是trade_order表的分庫分表相關的配置
trade_order:# 定義 'trade_order' 表的分片配置# 指定用于分片的實際數據節點。# 這里 'ds.trade_order_000${0..3}' 表示數據將分布在四個節點上:ds.trade_order_0000、ds.trade_order_0001、ds.trade_order_0002 和 ds.trade_order_0003。actual-data-nodes: ds.trade_order_000${0..3}# 定義主鍵生成策略keyGenerateStrategy:# 指定用于生成主鍵的列column: id# 指定使用的主鍵生成器名稱,這里使用的是 Snowflake 算法keyGeneratorName: snowflake# 定義表的分片策略table-strategy:# 使用復雜分片策略complex:# 指定用于分片的列,這里使用 buyer_idshardingColumns: buyer_id# 指定使用的分片算法名稱,這里使用的是 t-order-inline 算法shardingAlgorithmName: t-order-inline
spring.shardingsphere.rules.sharding.tables.shardingAlgorithms:是分表算法相關的配置
shardingAlgorithms:# 定義一個名為 t-order-inline 的分片算法t-order-inline:# 指定算法類型為 INLINEtype: INLINEprops:# 定義分片表達式,根據 buyer_id 的哈希值進行分片algorithm-expression: trade_order_0${Math.abs(buyer_id.hashCode()) % 4}# 這個表達式將 buyer_id 的哈希值取模 4,以確定記錄分配到哪個數據節點(trade_order_0000 到 trade_order_0003)
3、完成配置
按照以上方式,基本上就完成了 shardingjdbc 的接入,后續就可以進行數據庫操作了。