SpringBoot集成ShardingSphere-JDBC的基本使用指南
在 Spring Boot 中集成 ShardingSphere-JDBC,可以透明地將數(shù)據(jù)分片、讀寫(xiě)分離等功能引入到應(yīng)用中,而無(wú)需大規(guī)模修改業(yè)務(wù)代碼。以下是在 Spring Boot 中使用 ShardingSphere 的基本步驟和核心概念。
核心概念
在開(kāi)始之前,了解幾個(gè) ShardingSphere 的基本術(shù)語(yǔ)至關(guān)重要:
- 邏輯表 (Logical Table):應(yīng)用程序代碼中操作的表的名稱,例如
t_order。 - 真實(shí)表 (Actual Table):物理數(shù)據(jù)庫(kù)中真實(shí)存在的表,例如分布在不同數(shù)據(jù)庫(kù)中的
t_order_0,t_order_1。 - 分片鍵 (Sharding Key):用于決定數(shù)據(jù)屬于哪個(gè)分片的表列,常見(jiàn)的如
user_id,order_id。 - 分片算法 (Sharding Algorithm):用于路由數(shù)據(jù)的邏輯,例如基于取模運(yùn)算
sharding_key_value % number_of_shards。
ShardingSphere-JDBC 的魅力在于它會(huì)攔截應(yīng)用程序的 SQL 請(qǐng)求,并根據(jù)配置的規(guī)則將其路由到正確的真實(shí)數(shù)據(jù)源和真實(shí)表中執(zhí)行。
基本使用步驟
1. 添加 Maven 依賴
首先,在 Spring Boot 項(xiàng)目的 pom.xml 文件中添加 ShardingSphere 的官方 Spring Boot Starter 依賴。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.5.0</version> <!-- 建議使用最新穩(wěn)定版 -->
</dependency>
<!-- 還需要添加數(shù)據(jù)庫(kù)驅(qū)動(dòng)和JPA/MyBatis等依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2. 配置文件 (application.yml)
接下來(lái),在 application.yml (或 application.properties) 文件中進(jìn)行配置。這是集成工作的核心部分,主要包括數(shù)據(jù)源配置和分片規(guī)則配置。
以下是一個(gè)將 t_order 表水平分片到兩個(gè)數(shù)據(jù)庫(kù) (ds0, ds1),每個(gè)數(shù)據(jù)庫(kù)中又分為兩張表 (t_order_0, t_order_1) 的示例。
spring:
shardingsphere:
# 開(kāi)啟 SQL 日志,便于調(diào)試
props:
sql-show: true
# 1. 定義真實(shí)數(shù)據(jù)源
datasource:
names: ds0, ds1
# 第一個(gè)數(shù)據(jù)源
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds0?useSSL=false
username: root
password: your_password
# 第二個(gè)數(shù)據(jù)源
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/ds1?useSSL=false # 注意端口或地址不同
username: root
password: your_password
# 2. 定義規(guī)則
rules:
# 分片規(guī)則
sharding:
tables:
# 配置 t_order 表的規(guī)則
t_order:
# 數(shù)據(jù)節(jié)點(diǎn):邏輯表 t_order 映射到 ds0 和 ds1 的 t_order_0 和 t_order_1 表
actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
# 分庫(kù)策略
database-strategy:
standard:
sharding-column: user_id # 分庫(kù)鍵
sharding-algorithm-name: database_inline # 分庫(kù)算法名稱
# 分表策略
table-strategy:
standard:
sharding-column: order_id # 分表鍵
sharding-algorithm-name: table_inline # 分表算法名稱
# 3. 定義分片算法
sharding-algorithms:
# 數(shù)據(jù)庫(kù)分片算法:基于 user_id 取模
database_inline:
type: INLINE
props:
algorithm-expression: ds$->{user_id % 2}
# 表分片算法:基于 order_id 取模
table_inline:
type: INLINE
props:
algorithm-expression: t_order_$->{order_id % 2}
配置解釋:
spring.shardingsphere.datasource.names: 聲明所有真實(shí)數(shù)據(jù)源的名稱。spring.shardingsphere.rules.sharding.tables: 配置需要分片的表。actual-data-nodes: 這是核心映射關(guān)系。ds$->{0..1}.t_order_$->{0..1}是一種 Groovy 表達(dá)式,表示t_order表分布在ds0.t_order_0,ds0.t_order_1,ds1.t_order_0,ds1.t_order_1這四張真實(shí)表中。database-strategy和table-strategy: 分別定義分庫(kù)和分表的策略。這里使用的是標(biāo)準(zhǔn)策略 (standard)。sharding-column: 指定用于計(jì)算分片的列。sharding-algorithms: 定義具體的分片算法。INLINE是一種行內(nèi)表達(dá)式算法,適用于簡(jiǎn)單的分片邏輯。
3. 創(chuàng)建實(shí)體類和 Repository
ShardingSphere 對(duì)業(yè)務(wù)代碼是無(wú)侵入的,因此你可以像往常一樣使用 JPA、MyBatis 等 ORM 框架。
實(shí)體類 (Entity):
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_order") // 使用邏輯表名
public class Order {
@Id
private Long orderId;
private Long userId;
private String description;
// Getters and Setters
}
數(shù)據(jù)訪問(wèn)接口 (Repository):
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}4. 在業(yè)務(wù)邏輯中使用
在你的服務(wù)層中,直接注入 OrderRepository 并使用即可。ShardingSphere 會(huì)在底層自動(dòng)處理數(shù)據(jù)的路由。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public void createOrders() {
for (int i = 0; i < 10; i++) {
Order order = new Order();
order.setOrderId((long) i);
order.setUserId((long) (i % 4)); // 模擬不同的用戶
order.setDescription("Order for user " + order.getUserId());
orderRepository.save(order);
}
}
}
當(dāng) orderRepository.save(order) 被調(diào)用時(shí):
- ShardingSphere-JDBC 攔截該 SQL 操作。
- 它會(huì)解析出
user_id和order_id的值。 - 根據(jù)
application.yml中配置的database_inline算法 (ds${user_id % 2}),決定數(shù)據(jù)應(yīng)存入ds0還是ds1。 - 根據(jù)
table_inline算法 (t_order_${order_id % 2}),決定數(shù)據(jù)應(yīng)存入t_order_0還是t_order_1。 - 最終,SQL 被路由到正確的物理表中執(zhí)行。
通過(guò)以上步驟,我們就可以在 Spring Boot 項(xiàng)目中成功集成并基礎(chǔ)地使用 ShardingSphere-JDBC 實(shí)現(xiàn)數(shù)據(jù)分片。ShardingSphere 還支持讀寫(xiě)分離、數(shù)據(jù)加密和分布式事務(wù)等更高級(jí)的功能,這些也可以通過(guò)類似的配置文件進(jìn)行啟用和設(shè)置。
到此這篇關(guān)于SpringBoot集成ShardingSphere-JDBC的基本使用指南的文章就介紹到這了,更多相關(guān)SpringBoot集成ShardingSphere-JDBC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決spring-boot-starter-web等報(bào)紅問(wèn)題
這篇文章主要介紹了解決spring-boot-starter-web等報(bào)紅問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java8 使用CompletableFuture 構(gòu)建異步應(yīng)用方式
這篇文章主要介紹了Java8 使用CompletableFuture 構(gòu)建異步應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
JAVA項(xiàng)目如何打包部署到Linux服務(wù)器上
本文詳細(xì)介紹了在服務(wù)器上部署環(huán)境包括JDK、MySQL、Tomcat的設(shè)置,以及使用Idea-Maven-SpringBoot進(jìn)行jar包打包部署的流程,內(nèi)容涵蓋了MySQL配置注意事項(xiàng)、pom.xml配置、打包命令等關(guān)鍵步驟,同時(shí),也提供了如何將jar包上傳到Linux服務(wù)器并運(yùn)行的具體方法2024-10-10
一篇文章帶你入門(mén)Java數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Java常見(jiàn)數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望可以幫助到你2021-08-08
Java基于JDBC連接數(shù)據(jù)庫(kù)及顯示數(shù)據(jù)操作示例
這篇文章主要介紹了Java基于JDBC連接數(shù)據(jù)庫(kù)及顯示數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了Java使用jdbc進(jìn)行mysql數(shù)據(jù)庫(kù)連接與數(shù)據(jù)讀取、顯示等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
@JsonProperty和@JSONField注解的區(qū)別解析(最新)
Jackson是一款優(yōu)秀的JSON解析庫(kù),添加了依賴之后就可以使用對(duì)應(yīng)的注解,讓我們能夠自由的將Java對(duì)象和JSON做轉(zhuǎn)換,這篇文章主要介紹了@JsonProperty和@JSONField注解的區(qū)別,需要的朋友可以參考下2024-04-04
java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)
這篇文章主要介紹了java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08
Java設(shè)計(jì)模式之命令模式CommandPattern詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式CommandPattern詳解,命令模式是把一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作,需要的朋友可以參考下2023-10-10

