SpringBoot集成Hint语法组件的代码详解

 更新时间:2025年05月23日 08:27:00   作者:后端马农  
Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建和开发过程,通过将Hint集成到Spring Boot应用中,可以快速地在原有的代码中实现Hint语法 功能,本文给大家介绍了SpringBoot集成Hint语法组件的代码示例,需要的朋友可以参考下

引言

Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建和开发过程。它提供了大量的自动配置和可插拔的组件,使得开发人员能够快速构建基于Java的应用程序。 通过将Hint集成到Spring Boot应用中,可以快速地在原有的代码中实现Hint语法 功能。这种集成方式利用了Spring Boot的自动配置和依赖注入特性,使得代码的编写和维护更加简单。

背景

现在MYSQL数据库架构采用一主多从;

主库(Master):唯一接受写请求的节点,通过二进制日志(binlog)记录变更,承担数据一致性的核心职责。

从库(Slave):实时异步复制主库的binlog,通过relay log重放实现数据同步,支持水平扩展读能力。

优势:读扩展性、高可用基石、数据安全、负载隔离

典型问题:主从延迟难题、主库单点瓶颈、数据一致性保障

保障主数据库安全,采用了读写隔离,但这样可能就会遇到主从延迟难题。下面介绍我们遇到的问题及解决方案。

问题:

我们数据库是腾讯云的MYSQL,并开始了数据库代理功能(数据库代理功能:自动读写分离功能、自适应负载均衡功能、事务拆分功能等)。但是存在一个问题:新增数据或者修改数据后,因为我们读写分离的,读是链接从库,写是主库,短时间内再去查询偶尔出现数据延迟问题。

解决方案:

  • 代码连接多个数据源:当需要方案主库时候切换到主库数据源。
  • 数据库采用代理方式,使用hint语法指定SQL强制路由到主库。

组件实现内容:

使用 Hint 语法可以强制 SQL 请求在指定的实例上执行,Hint 的路由优先级最高,例如,Hint 不受一致性、事务的约束,使用前请合理评估业务场景是否需要。

云数据库 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的灵魂组件,拦截器的核心价值在于实现SQL执行全流程的精细化控制,覆盖参数处理、SQL改写、结果集加工等场景。其底层通过动态代理拦截四大核心接口:

  • Executor:控制SQL执行逻辑(增删改查)
  • StatementHandler:介入SQL预编译与参数绑定
  • ParameterHandler:实现参数二次处理
  • 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*/", "强制走主库")

接下来执行SQL,User pojo = this.getById(id);

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

        // 强制路由到主库查询
        HintContext.markHint(MysqlEnum.TO_MASTER.getHint());
        // 执行数据库查询
        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 */");
        // 执行数据库查询
        User pojo = this.getById(id);
        if (pojo == null) {
            return null;
        }
        UserInfoVO userInfoVO = new UserInfoVO();
        userInfoVO.setCode(pojo.getCode());
        userInfoVO.setName(pojo.getUsername());
        return userInfoVO;
    }

执行结果:SELECT /*FORCE_MASTER*/ id,code,username,password FROM test_user WHERE id=?

到此这篇关于SpringBoot集成Hint语法组件的代码详解的文章就介绍到这了,更多相关SpringBoot集成Hint内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用python实现英文字母和相应序数转换的方法

    用python实现英文字母和相应序数转换的方法

    这篇文章主要介绍了用python实现英文字母和相应序数转换的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python实现列表中由数值查到索引的方法

    python实现列表中由数值查到索引的方法

    今天小编就为大家分享一篇python实现列表中由数值查到索引的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 基于Python实现开发钉钉通知机器人

    基于Python实现开发钉钉通知机器人

    在项目协同工作或自动化流程完成时,我们需要用一定的手段通知自己或他人。Telegram 非常好用,几个步骤就能创建一个机器人,可惜在国内无法使用。所以本文就来开发一个钉钉通知机器人吧
    2023-02-02
  • 使用Pytorch实现two-head(多输出)模型的操作

    使用Pytorch实现two-head(多输出)模型的操作

    这篇文章主要介绍了使用Pytorch实现two-head(多输出)模型的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 手写一个python迭代器过程详解

    手写一个python迭代器过程详解

    这篇文章主要介绍了手写一个python迭代器过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 深入理解python中sort()与sorted()的区别

    深入理解python中sort()与sorted()的区别

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。这篇文章主要介绍了python中sort()与sorted()的区别,需要的朋友可以参考下
    2018-08-08
  • python使用PyGame绘制图像并保存为图片文件的方法

    python使用PyGame绘制图像并保存为图片文件的方法

    这篇文章主要介绍了python使用PyGame绘制图像并保存为图片文件的方法,涉及Python使用PyGame操作图片的相关技巧,需要的朋友可以参考下
    2015-04-04
  • python中hasattr方法示例详解

    python中hasattr方法示例详解

    hasattr()函数是Python中一个非常有用的工具,可以帮助我们在运行时检查对象的属性或方法,通过合理地使用hasattr()函数,我们可以写出更灵活、可维护和健壮的代码,这篇文章主要介绍了python中hasattr方法,需要的朋友可以参考下
    2023-12-12
  • Python实现扣除个人税后的工资计算器示例

    Python实现扣除个人税后的工资计算器示例

    这篇文章主要介绍了Python实现扣除个人税后的工资计算器,涉及Python流程控制与数学运算相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • python 批量压缩图片的脚本

    python 批量压缩图片的脚本

    用Python编写的批量压缩图片的脚本,可以自定义压缩质量,有批量图片压缩需求的朋友可以直接拿来用
    2021-06-06

最新评论