欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成Hint語法組件的代碼詳解

 更新時間:2025年05月23日 08:27:00   作者:后端馬農(nóng)  
Spring?Boot是Spring框架的一個擴展,旨在簡化Spring應用的初始搭建和開發(fā)過程,通過將Hint集成到Spring?Boot應用中,可以快速地在原有的代碼中實現(xiàn)Hint語法?功能,本文給大家介紹了SpringBoot集成Hint語法組件的代碼示例,需要的朋友可以參考下

引言

Spring Boot是Spring框架的一個擴展,旨在簡化Spring應用的初始搭建和開發(fā)過程。它提供了大量的自動配置和可插拔的組件,使得開發(fā)人員能夠快速構建基于Java的應用程序。 通過將Hint集成到Spring Boot應用中,可以快速地在原有的代碼中實現(xiàn)Hint語法 功能。這種集成方式利用了Spring Boot的自動配置和依賴注入特性,使得代碼的編寫和維護更加簡單。

背景

現(xiàn)在MYSQL數(shù)據(jù)庫架構采用一主多從;

主庫(Master):唯一接受寫請求的節(jié)點,通過二進制日志(binlog)記錄變更,承擔數(shù)據(jù)一致性的核心職責。

從庫(Slave):實時異步復制主庫的binlog,通過relay log重放實現(xiàn)數(shù)據(jù)同步,支持水平擴展讀能力。

優(yōu)勢:讀擴展性、高可用基石、數(shù)據(jù)安全、負載隔離

典型問題:主從延遲難題、主庫單點瓶頸、數(shù)據(jù)一致性保障

保障主數(shù)據(jù)庫安全,采用了讀寫隔離,但這樣可能就會遇到主從延遲難題。下面介紹我們遇到的問題及解決方案。

問題:

我們數(shù)據(jù)庫是騰訊云的MYSQL,并開始了數(shù)據(jù)庫代理功能(數(shù)據(jù)庫代理功能:自動讀寫分離功能、自適應負載均衡功能、事務拆分功能等)。但是存在一個問題:新增數(shù)據(jù)或者修改數(shù)據(jù)后,因為我們讀寫分離的,讀是鏈接從庫,寫是主庫,短時間內(nèi)再去查詢偶爾出現(xiàn)數(shù)據(jù)延遲問題。

解決方案:

  • 代碼連接多個數(shù)據(jù)源:當需要方案主庫時候切換到主庫數(shù)據(jù)源。
  • 數(shù)據(jù)庫采用代理方式,使用hint語法指定SQL強制路由到主庫。

組件實現(xiàn)內(nèi)容:

使用 Hint 語法可以強制 SQL 請求在指定的實例上執(zhí)行,Hint 的路由優(yōu)先級最高,例如,Hint 不受一致性、事務的約束,使用前請合理評估業(yè)務場景是否需要。

云數(shù)據(jù)庫 MySQL Hint 語法使用

組件設計

源碼地址github

核心代碼解析

Hint上下文

上下文主要管理Hint 語句、及SQL添加Hint標志等。

public class HintContext {

    private static final ThreadLocal<String> hint = ThreadLocal.withInitial(() -> null);

    public static void markHint(String s) {
        hint.set(s);
    }

    public static boolean isHint() {
        return StringUtils.isNotBlank(hint.get());
    }

    public static String getHint() {
        return hint.get();
    }

    public static void clear() {
        hint.remove();
    }

}

攔截器

作為MyBatis的靈魂組件,攔截器的核心價值在于實現(xiàn)SQL執(zhí)行全流程的精細化控制,覆蓋參數(shù)處理、SQL改寫、結果集加工等場景。其底層通過動態(tài)代理攔截四大核心接口:

  • Executor:控制SQL執(zhí)行邏輯(增刪改查)
  • StatementHandler:介入SQL預編譯與參數(shù)綁定
  • ParameterHandler:實現(xiàn)參數(shù)二次處理
  • ResultSetHandler:定制化結果集映射。

主要運用了Executor攔截器,對查詢SQL進行攔截,當Hint上下文存在時候,對SQL進行修改,下面代碼是今天SQL修改核心代碼。

     private void changeSQL(BoundSql boundSql, String hint) {
                String originalSql = boundSql.getSql();
                String newSql = originalSql.replaceFirst("(?i)SELECT\s+", "SELECT "+ hint +" ");
                // 使用MetaObject對象將新的SQL語句設置到BoundSql對象中
                MetaObject metaObject = SystemMetaObject.forObject(boundSql);
                metaObject.setValue("sql", newSql);
        }

快速開始

源代碼

添加maven

<dependency>
  <groupId>com.github.hint</groupId>
  <artifactId>mybatis-hint-spring-boot-starter</artifactId>
</dependency>

添加配置

hint:
  enable: true

代碼demo

hint上下文設置hint語句(HintContext.markHint(MysqlEnum.TO_MASTER.getHint());

備注:TO_MASTER("/*FORCE_MASTER*/", "強制走主庫")

接下來執(zhí)行SQL,User pojo = this.getById(id);

//采用MysqlEnum的hint語句
public UserInfoVO getInfoById(Long id) {

        // 強制路由到主庫查詢
        HintContext.markHint(MysqlEnum.TO_MASTER.getHint());
        // 執(zhí)行數(shù)據(jù)庫查詢
        User pojo = this.getById(id);
        if (pojo == null) {
            return null;
        }
        UserInfoVO userInfoVO = new UserInfoVO();
        userInfoVO.setCode(pojo.getCode());
        userInfoVO.setName(pojo.getUsername());
        return userInfoVO;
    }

//自定義的hint語句
public UserInfoVO getInfoById(Long id) {

        // 強制路由到指定的實例
        HintContext.markHint("/* to server test_ro_1 */");
        // 執(zhí)行數(shù)據(jù)庫查詢
        User pojo = this.getById(id);
        if (pojo == null) {
            return null;
        }
        UserInfoVO userInfoVO = new UserInfoVO();
        userInfoVO.setCode(pojo.getCode());
        userInfoVO.setName(pojo.getUsername());
        return userInfoVO;
    }

執(zhí)行結果:SELECT /*FORCE_MASTER*/ id,code,username,password FROM test_user WHERE id=?

到此這篇關于SpringBoot集成Hint語法組件的代碼詳解的文章就介紹到這了,更多相關SpringBoot集成Hint內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 用python實現(xiàn)英文字母和相應序數(shù)轉(zhuǎn)換的方法

    用python實現(xiàn)英文字母和相應序數(shù)轉(zhuǎn)換的方法

    這篇文章主要介紹了用python實現(xiàn)英文字母和相應序數(shù)轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • python實現(xiàn)列表中由數(shù)值查到索引的方法

    python實現(xiàn)列表中由數(shù)值查到索引的方法

    今天小編就為大家分享一篇python實現(xiàn)列表中由數(shù)值查到索引的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 基于Python實現(xiàn)開發(fā)釘釘通知機器人

    基于Python實現(xiàn)開發(fā)釘釘通知機器人

    在項目協(xié)同工作或自動化流程完成時,我們需要用一定的手段通知自己或他人。Telegram 非常好用,幾個步驟就能創(chuàng)建一個機器人,可惜在國內(nèi)無法使用。所以本文就來開發(fā)一個釘釘通知機器人吧
    2023-02-02
  • 使用Pytorch實現(xiàn)two-head(多輸出)模型的操作

    使用Pytorch實現(xiàn)two-head(多輸出)模型的操作

    這篇文章主要介紹了使用Pytorch實現(xiàn)two-head(多輸出)模型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 手寫一個python迭代器過程詳解

    手寫一個python迭代器過程詳解

    這篇文章主要介紹了手寫一個python迭代器過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 深入理解python中sort()與sorted()的區(qū)別

    深入理解python中sort()與sorted()的區(qū)別

    Python list內(nèi)置sort()方法用來排序,也可以用python內(nèi)置的全局sorted()方法來對可迭代的序列排序生成新的序列。這篇文章主要介紹了python中sort()與sorted()的區(qū)別,需要的朋友可以參考下
    2018-08-08
  • python使用PyGame繪制圖像并保存為圖片文件的方法

    python使用PyGame繪制圖像并保存為圖片文件的方法

    這篇文章主要介紹了python使用PyGame繪制圖像并保存為圖片文件的方法,涉及Python使用PyGame操作圖片的相關技巧,需要的朋友可以參考下
    2015-04-04
  • python中hasattr方法示例詳解

    python中hasattr方法示例詳解

    hasattr()函數(shù)是Python中一個非常有用的工具,可以幫助我們在運行時檢查對象的屬性或方法,通過合理地使用hasattr()函數(shù),我們可以寫出更靈活、可維護和健壯的代碼,這篇文章主要介紹了python中hasattr方法,需要的朋友可以參考下
    2023-12-12
  • Python實現(xiàn)扣除個人稅后的工資計算器示例

    Python實現(xiàn)扣除個人稅后的工資計算器示例

    這篇文章主要介紹了Python實現(xiàn)扣除個人稅后的工資計算器,涉及Python流程控制與數(shù)學運算相關操作技巧,需要的朋友可以參考下
    2018-03-03
  • python 批量壓縮圖片的腳本

    python 批量壓縮圖片的腳本

    用Python編寫的批量壓縮圖片的腳本,可以自定義壓縮質(zhì)量,有批量圖片壓縮需求的朋友可以直接拿來用
    2021-06-06

最新評論