SpringBoot【问题 02】@Component + @DS(“xxx“) 多数据源无法切换(问题复现+解决+分析)

简介: SpringBoot【问题 02】@Component + @DS(“xxx“) 多数据源无法切换(问题复现+解决+分析)

1.问题

Java代码:

@Component
@DS("greenplum")
public class GreenPlumComponent {
    @Resource
    private CommonMapper commonMapper;
    private AtomicInteger nextVal;
    @PostConstruct
    public int querySeqNextVal() {
        if (nextVal == null) {
          // seqName 是通过配置文件传过来的这里为了简洁删除了配置文件代码 
            this.nextVal = new AtomicInteger(commonMapper.querySeqNextValBySeqName("seqName"));
        }
        return nextVal.getAndIncrement();
    }
}

Mapper文件内的SQL:

<select id="querySeqNextValBySeqName" resultType="java.lang.Integer">
  SELECT nextval( #{seqName} )
</select>

运行报错:

Cause: java.sql.SQLSyntaxErrorException: FUNCTION mysql.nextval does not exist; 
bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: 
FUNCTION xa-mysql.nextval does not exist

异常的原因是: 本应该查询greenplum查询的却是mysql,也就是@DS("greenplum")未生效。

2.解决

Java代码去掉 @PostConstruct

@Component
@DS("greenplum")
public class GreenPlumComponent {
    @Resource
    private CommonMapper commonMapper;
    private AtomicInteger nextVal;
    public int querySeqNextVal() {
        if (nextVal == null) {
          // seqName 是通过配置文件传过来的这里为了简洁删除了配置文件代码 
            this.nextVal = new AtomicInteger(commonMapper.querySeqNextValBySeqName("seqName"));
        }
        return nextVal.getAndIncrement();
    }
}

调用:

@Autowired
    private GreenPlumComponent greenPlumComponent;
    private List<Map> dealData() {
      // 使用
        int nextVal = greenPlumComponent.querySeqNextVal();
    }

3.分析

可能的问题:

  • 由于 @Component 容器实例化后会调用 @PostConstruct 注解的方法,此时方法的调用并非实例对象调用。
  • @DS 注解利用的是 AOP 非实例对象调用无法触发。

求证后会更新内容,当前仅作记录。

目录
相关文章
|
9天前
|
XML 人工智能 IDE
Springboot整合SSMP报错分析
本文介绍了Springboot整合SSMP框架时常见的报错及解决方案,包括MyBatis-Plus版本不兼容导致的Lambda表达式条件构造器报错及表名不匹配问题。通过升级或降级MyBatis-Plus版本、使用@TableName注解或配置table-prefix属性,可有效解决上述问题,帮助开发者避免在整合SSMP时出现不必要的错误。
|
3月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
158 0
|
6月前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
120 5
|
7月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
1024 0
|
8月前
|
Java 数据库连接
SpringBoot配置多数据源实战
第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision
156 8
|
9月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
1857 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
9月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
515 2
|
12月前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
187 11
|
开发框架 Java 数据库
Spring Boot集成多数据源的最佳实践
Spring Boot集成多数据源的最佳实践