国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離,微服務(wù)架構(gòu)設(shè)計(jì),Java學(xué)習(xí)路線(xiàn),spring boot,后端,java

??歡迎來(lái)到架構(gòu)設(shè)計(jì)專(zhuān)欄~Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒??
  • ?博客主頁(yè):IT·陳寒的博客
  • ??該系列文章專(zhuān)欄:架構(gòu)設(shè)計(jì)
  • ??其他專(zhuān)欄:Java學(xué)習(xí)路線(xiàn) Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)
  • ??文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正??
  • ?? 歡迎大家關(guān)注! ??

Spring Boot作為一種快速開(kāi)發(fā)框架,廣泛應(yīng)用于Java項(xiàng)目中。在一些大型應(yīng)用中,數(shù)據(jù)庫(kù)的讀寫(xiě)分離是提升性能和擴(kuò)展性的一種重要手段。本文將介紹如何在Spring Boot項(xiàng)目中優(yōu)雅地實(shí)現(xiàn)讀寫(xiě)分離,并通過(guò)適當(dāng)?shù)拇a插入,詳細(xì)展開(kāi)實(shí)現(xiàn)步驟,同時(shí)進(jìn)行拓展和分析。
Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離,微服務(wù)架構(gòu)設(shè)計(jì),Java學(xué)習(xí)路線(xiàn),spring boot,后端,java

1. 讀寫(xiě)分離簡(jiǎn)介

讀寫(xiě)分離是指在數(shù)據(jù)庫(kù)集群中,將數(shù)據(jù)庫(kù)的讀操作和寫(xiě)操作分別分配到不同的節(jié)點(diǎn)上。這樣可以充分利用多臺(tái)服務(wù)器的資源,提高系統(tǒng)的并發(fā)處理能力。一般來(lái)說(shuō),寫(xiě)操作相對(duì)讀操作更為耗時(shí),通過(guò)讀寫(xiě)分離,可以有效減輕主庫(kù)的負(fù)擔(dān)。

2. Spring Boot集成MyBatis

首先,我們需要在Spring Boot項(xiàng)目中集成MyBatis,作為數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的ORM框架??梢酝ㄟ^(guò)在pom.xml文件中添加依賴(lài)來(lái)引入MyBatis和MyBatis-Spring-Boot-Starter:

<!-- MyBatis依賴(lài) -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<!-- 數(shù)據(jù)庫(kù)連接池依賴(lài)(這里以HikariCP為例) -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

然后,配置application.properties文件,指定數(shù)據(jù)庫(kù)連接信息:

# 主庫(kù)
spring.datasource.master.url=jdbc:mysql://master-host:3306/master_db
spring.datasource.master.username=root
spring.datasource.master.password=root
# 從庫(kù)
spring.datasource.slave.url=jdbc:mysql://slave-host:3306/slave_db
spring.datasource.slave.username=root
spring.datasource.slave.password=root

3. 配置讀寫(xiě)分離數(shù)據(jù)源

在實(shí)現(xiàn)讀寫(xiě)分離前,我們需要定義一個(gè)數(shù)據(jù)源路由器,用于根據(jù)不同的操作選擇不同的數(shù)據(jù)源。在Spring Boot中,可以通過(guò)AbstractRoutingDataSource實(shí)現(xiàn)這一功能。以下是一個(gè)簡(jiǎn)單的數(shù)據(jù)源路由器示例:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class RoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }
}

在上述代碼中,determineCurrentLookupKey方法用于確定當(dāng)前使用的數(shù)據(jù)源,DataSourceContextHolder是一個(gè)自定義的上下文持有類(lèi),用于存儲(chǔ)當(dāng)前線(xiàn)程使用的數(shù)據(jù)源類(lèi)型。接下來(lái),我們需要在配置類(lèi)中配置這個(gè)數(shù)據(jù)源路由器:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "routingDataSource")
    public RoutingDataSource routingDataSource(
            @Qualifier("masterDataSource") DataSource masterDataSource,
            @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        RoutingDataSource routingDataSource = new RoutingDataSource();
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.MASTER, masterDataSource);
        targetDataSources.put(DataSourceType.SLAVE, slaveDataSource);
        routingDataSource.setTargetDataSources(targetDataSources);
        routingDataSource.setDefaultTargetDataSource(masterDataSource);
        return routingDataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource routingDataSource) {
        return new DataSourceTransactionManager(routingDataSource);
    }
}

在上述代碼中,我們配置了兩個(gè)數(shù)據(jù)源,一個(gè)用于主庫(kù),一個(gè)用于從庫(kù)。然后,通過(guò)routingDataSource方法創(chuàng)建了一個(gè)RoutingDataSource實(shí)例,將主庫(kù)和從庫(kù)加入到數(shù)據(jù)源路由器中,并設(shè)置默認(rèn)數(shù)據(jù)源為主庫(kù)。

4. 定義數(shù)據(jù)源上下文

接下來(lái),我們需要定義一個(gè)數(shù)據(jù)源上下文類(lèi),用于在當(dāng)前線(xiàn)程中保存和獲取當(dāng)前使用的數(shù)據(jù)源類(lèi)型。這個(gè)上下文類(lèi)應(yīng)該是線(xiàn)程安全的,因?yàn)樗鼤?huì)在多個(gè)線(xiàn)程中被訪(fǎng)問(wèn)。

public class DataSourceContextHolder {

    private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();

    public static void setDataSourceType(DataSourceType dataSourceType) {
        contextHolder.set(dataSourceType);
    }

    public static DataSourceType getDataSourceType() {
        return contextHolder.get();
    }

    public static void clearDataSourceType() {
        contextHolder.remove();
    }
}

5. 自定義注解和切面

為了在Service層標(biāo)注讀操作和寫(xiě)操作,我們可以定義兩個(gè)自定義注解@Master@Slave,并創(chuàng)建一個(gè)切面DataSourceAspect,通過(guò)AOP切入點(diǎn)攔截被這兩個(gè)注解標(biāo)記的方法,然后在方法執(zhí)行前設(shè)置數(shù)據(jù)源類(lèi)型。

@Aspect
@Component
public class DataSourceAspect {

    @Before("@annotation(master)")
    public void setMasterDataSource(JoinPoint joinPoint, Master master) {
        DataSource

ContextHolder.setDataSourceType(DataSourceType.MASTER);
    }

    @Before("@annotation(slave)")
    public void setSlaveDataSource(JoinPoint joinPoint, Slave slave) {
        DataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE);
    }

    @After("@annotation(master) || @annotation(slave)")
    public void clearDataSourceType(JoinPoint joinPoint, Master master, Slave slave) {
        DataSourceContextHolder.clearDataSourceType();
    }
}

在上述代碼中,通過(guò)@Before注解定義了兩個(gè)切入點(diǎn),分別攔截被@Master@Slave注解標(biāo)記的方法,在方法執(zhí)行前設(shè)置對(duì)應(yīng)的數(shù)據(jù)源類(lèi)型。在@After注解中清除當(dāng)前線(xiàn)程的數(shù)據(jù)源類(lèi)型。

6. 在Service層使用注解

最后,在Service層需要進(jìn)行讀寫(xiě)分離的方法上使用定義好的注解,標(biāo)記讀操作和寫(xiě)操作。以下是一個(gè)示例:

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Master
    public User getUserById(int userId) {
        return userMapper.selectById(userId);
    }

    @Slave
    public List<User> listAllUsers() {
        return userMapper.selectAll();
    }

    @Master
    public void saveUser(User user) {
        userMapper.insert(user);
    }
}

在上述示例中,@Master@Slave注解分別用于標(biāo)記讀操作和寫(xiě)操作的方法。在實(shí)際應(yīng)用中,根據(jù)具體需求和業(yè)務(wù)場(chǎng)景進(jìn)行靈活使用。

7. 拓展與分析

7.1 多數(shù)據(jù)源的選擇

上述示例中使用了兩個(gè)數(shù)據(jù)源,一個(gè)用于主庫(kù),一個(gè)用于從庫(kù)。在實(shí)際應(yīng)用中,如果有多個(gè)從庫(kù),可以在配置類(lèi)中配置多個(gè)從庫(kù)數(shù)據(jù)源,然后在數(shù)據(jù)源路由器中動(dòng)態(tài)選擇。

7.2 事務(wù)的處理

在涉及到事務(wù)的場(chǎng)景中,需要注意對(duì)事務(wù)的處理。在使用讀寫(xiě)分離的情況下,一般將寫(xiě)操作放在事務(wù)中,而讀操作不放在事務(wù)中。因?yàn)槭聞?wù)一般需要使用主庫(kù),而從庫(kù)主要用于讀取操作,不參與事務(wù)的提交與回滾。

7.3 異常處理

在使用讀寫(xiě)分離的過(guò)程中,可能會(huì)遇到主從同步延遲導(dǎo)致的數(shù)據(jù)不一致問(wèn)題。因此,在涉及到數(shù)據(jù)一致性要求較高的業(yè)務(wù)場(chǎng)景中,需要謹(jǐn)慎使用讀寫(xiě)分離,考慮一些其他的解決方案,如數(shù)據(jù)的多版本控制等。

7.4 動(dòng)態(tài)數(shù)據(jù)源切換

上述示例中使用AOP切面在方法執(zhí)行前設(shè)置數(shù)據(jù)源類(lèi)型。在某些場(chǎng)景中,可能需要在代碼中動(dòng)態(tài)切換數(shù)據(jù)源,這時(shí)可以通過(guò)編程式的方式設(shè)置數(shù)據(jù)源類(lèi)型,而不是依賴(lài)AOP。

7.5 Spring Boot版本適配

請(qǐng)注意根據(jù)使用的Spring Boot版本來(lái)選擇相應(yīng)的依賴(lài)版本。在示例中,使用的MyBatis版本是2.2.0,如果使用的是較新的Spring Boot版本,建議查閱官方文檔或相關(guān)依賴(lài)庫(kù)的最新版本。

Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離,微服務(wù)架構(gòu)設(shè)計(jì),Java學(xué)習(xí)路線(xiàn),spring boot,后端,java

通過(guò)上述步驟,我們完成了Spring Boot項(xiàng)目中讀寫(xiě)分離的優(yōu)雅實(shí)現(xiàn)。通過(guò)合理的代碼插入,詳細(xì)展開(kāi)了每個(gè)步驟的實(shí)現(xiàn),并對(duì)一些拓展和分析進(jìn)行了說(shuō)明。希望這篇文章對(duì)正在進(jìn)行數(shù)據(jù)庫(kù)優(yōu)化的開(kāi)發(fā)者有所幫助。


??結(jié)尾 ?? 感謝您的支持和鼓勵(lì)! ????
??您可能感興趣的內(nèi)容:

  • 【Java面試技巧】Java面試八股文 - 掌握面試必備知識(shí)(目錄篇)
  • 【Java學(xué)習(xí)路線(xiàn)】2023年完整版Java學(xué)習(xí)路線(xiàn)圖
  • 【AIGC人工智能】Chat GPT是什么,初學(xué)者怎么使用Chat GPT,需要注意些什么
  • 【Java實(shí)戰(zhàn)項(xiàng)目】SpringBoot+SSM實(shí)戰(zhàn):打造高效便捷的企業(yè)級(jí)Java外賣(mài)訂購(gòu)系統(tǒng)
  • 【數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)】從零起步:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的完整路徑

Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離,微服務(wù)架構(gòu)設(shè)計(jì),Java學(xué)習(xí)路線(xiàn),spring boot,后端,java文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755058.html

到了這里,關(guān)于Spring Boot項(xiàng)目?jī)?yōu)雅實(shí)現(xiàn)讀寫(xiě)分離的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Boot 優(yōu)雅實(shí)現(xiàn)多租戶(hù)架構(gòu),so easy~!

    多租戶(hù)架構(gòu)是指在一個(gè)應(yīng)用中支持多個(gè)租戶(hù)(Tenant)同時(shí)訪(fǎng)問(wèn),每個(gè)租戶(hù)擁有獨(dú)立的資源和數(shù)據(jù),并且彼此之間完全隔離。通俗來(lái)說(shuō),多租戶(hù)就是把一個(gè)應(yīng)用按照客戶(hù)的需求“分割”成多個(gè)獨(dú)立的實(shí)例,每個(gè)實(shí)例互不干擾。 更好地滿(mǎn)足不同租戶(hù)的個(gè)性化需求。 可以降低運(yùn)維

    2024年02月09日
    瀏覽(21)
  • spring boot +Sa-Token優(yōu)雅的實(shí)現(xiàn)項(xiàng)目鑒權(quán)!

    spring boot +Sa-Token優(yōu)雅的實(shí)現(xiàn)項(xiàng)目鑒權(quán)!

    最近在做登錄、授權(quán)的功能,一開(kāi)始考慮到的是spring boot + spring security,但spring security太重,而我們是輕量級(jí)的項(xiàng)目,所以,spring security不適合我們。 而后考慮spring boot + shiro,但shiro自帶的aop會(huì)影響spring boot的aop,所以,shiro也不適合我們。 后來(lái)瀏覽github時(shí),發(fā)現(xiàn)Sa-Token這個(gè)框

    2024年02月06日
    瀏覽(20)
  • Spring Boot+Vue前后端分離項(xiàng)目如何部署到服務(wù)器

    Spring Boot+Vue前后端分離項(xiàng)目如何部署到服務(wù)器

    ?? 前言 歡迎來(lái)到我的技術(shù)小宇宙!?? 這里不僅是我記錄技術(shù)點(diǎn)滴的后花園,也是我分享學(xué)習(xí)心得和項(xiàng)目經(jīng)驗(yàn)的樂(lè)園。?? 無(wú)論你是技術(shù)小白還是資深大牛,這里總有一些內(nèi)容能觸動(dòng)你的好奇心。?? ?? 洛可可白 :個(gè)人主頁(yè) ?? 個(gè)人專(zhuān)欄 :?前端技術(shù) ?后端技術(shù) ?? 個(gè)人

    2024年04月11日
    瀏覽(108)
  • spring boot+mybatis-plus配置讀寫(xiě)分離

    對(duì)于mysql主從機(jī)制的讀寫(xiě)分離,對(duì)于寫(xiě)操作寫(xiě)入主庫(kù),讀取操作讀取從庫(kù) 一、安裝依賴(lài) 二、配置文件配置數(shù)據(jù)源 三、在service,如果是讀取操作的話(huà),則需要加上注解@DS(“slave”)即可,可看如下示例

    2024年01月25日
    瀏覽(22)
  • 企業(yè)級(jí)實(shí)戰(zhàn) Spring Boot + K8S 中的滾動(dòng)發(fā)布、優(yōu)雅停機(jī)、彈性伸縮、應(yīng)用監(jiān)控、配置分離

    下面為大家介紹我司生產(chǎn)環(huán)境使用了3年的基于K8S的dev ops 配置實(shí)現(xiàn) K8s + SpringCloud實(shí)現(xiàn)零宕機(jī)發(fā)版,優(yōu)雅重啟:健康檢查+滾動(dòng)更新+優(yōu)雅停機(jī)+彈性伸縮+Prometheus監(jiān)控+配置分離(鏡像復(fù)用) 業(yè)務(wù)層面 項(xiàng)目依賴(lài) pom.xml 使用 spring-boot-starter-actuator 鏡像 存活、就緒檢查 使用 prometheus

    2024年02月06日
    瀏覽(23)
  • “深入探究Spring Boot:實(shí)現(xiàn)微服務(wù)架構(gòu)的利器“

    標(biāo)題:深入探究Spring Boot:實(shí)現(xiàn)微服務(wù)架構(gòu)的利器 摘要:本文將深入探討Spring Boot作為實(shí)現(xiàn)微服務(wù)架構(gòu)的利器。我們將介紹Spring Boot的特點(diǎn)、優(yōu)勢(shì)以及如何使用它來(lái)構(gòu)建高效、可擴(kuò)展的微服務(wù)應(yīng)用。同時(shí),我們還將通過(guò)示例代碼演示如何使用Spring Boot創(chuàng)建一個(gè)簡(jiǎn)單的微服務(wù)應(yīng)用

    2024年02月16日
    瀏覽(25)
  • Java之Spring Boot+Vue+Element UI前后端分離項(xiàng)目,前端插件化主流框架和實(shí)現(xiàn)原理

    Java之Spring Boot+Vue+Element UI前后端分離項(xiàng)目,前端插件化主流框架和實(shí)現(xiàn)原理

    三、設(shè)置Axios發(fā)起請(qǐng)求統(tǒng)一前綴的路徑 https://code100.blog.csdn.net/article/details/123302546 1、HelloWorld.vue getInfo() { this.$http.get(‘blog/queryBlogByPage?title=’ + this.title + ‘page=’ + this.page + ‘rows=’ + this.rows) .then(response = ( this.info = response.data, this.total = this.info.total, this.totalPage = this.info.tota

    2024年04月16日
    瀏覽(61)
  • Spring Boot如何實(shí)現(xiàn)微服務(wù)架構(gòu)中的API網(wǎng)關(guān)?

    Spring Boot如何實(shí)現(xiàn)微服務(wù)架構(gòu)中的API網(wǎng)關(guān)?

    隨著微服務(wù)架構(gòu)的流行,越來(lái)越多的企業(yè)開(kāi)始構(gòu)建自己的微服務(wù)系統(tǒng)。在這種情況下,API網(wǎng)關(guān)變得尤為重要。API網(wǎng)關(guān)是微服務(wù)架構(gòu)中的一個(gè)組件,它可以幫助我們管理和路由所有的API請(qǐng)求。Spring Boot提供了一些工具和框架,可以幫助我們輕松地實(shí)現(xiàn)API網(wǎng)關(guān)。在本文中,我們將

    2024年02月07日
    瀏覽(100)
  • Spring Boot進(jìn)階(73):Spring Boot如何優(yōu)雅地使用Feign進(jìn)行服務(wù)間通信?

    Spring Boot進(jìn)階(73):Spring Boot如何優(yōu)雅地使用Feign進(jìn)行服務(wù)間通信?

    ????????在分布式系統(tǒng)中,服務(wù)間通信是非常常見(jiàn)的情況。而Feign就是一個(gè)開(kāi)源的Java HTTP客戶(hù)端,可以幫助我們?cè)赟pring Boot應(yīng)用中快速構(gòu)建和使用HTTP客戶(hù)端,方便實(shí)現(xiàn)服務(wù)間的通信。本文將介紹如何優(yōu)雅地使用Feign進(jìn)行服務(wù)間通信。 ? ? ? ? 那么,具體如何實(shí)現(xiàn)呢?這將又

    2024年02月06日
    瀏覽(23)
  • 使用 System.exit() 來(lái)優(yōu)雅地終止 Spring Boot 項(xiàng)目

    使用 System.exit() 來(lái)優(yōu)雅地終止 Spring Boot 項(xiàng)目

    ?? @ 作者: 一恍過(guò)去 ?? @ 主頁(yè): https://blog.csdn.net/zhuocailing3390 ?? @ 社區(qū): Java技術(shù)棧交流 ?? @ 主題: 使用 System.exit() 來(lái)優(yōu)雅地終止 Spring Boot 項(xiàng)目 ?? @ 創(chuàng)作時(shí)間: 2023年09月04日 System.exit(): System.exit() 方法是 Java 中用于退出程序的方法。它接受一個(gè)整數(shù)參數(shù),通常被用

    2024年02月09日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包