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 非实例对象调用无法触发。

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

目录
相关文章
|
4月前
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
2月前
|
JavaScript Java Apache
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
159 0
|
2月前
|
存储 Java 关系型数据库
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
65 0
QGS
|
3月前
|
Java 关系型数据库 MySQL
手拉手springboot3整合mybatis-plus多数据源
手拉手springboot3整合mybatis-plus多数据源
QGS
67 1
|
3月前
|
前端开发 Java 数据库连接
Spring Boot常见企业开发场景应用、自动配置原理结构分析(一)
Spring Boot常见企业开发场景应用、自动配置原理结构分析
|
3月前
|
Java 数据库 数据安全/隐私保护
使用Spring Boot和JPA实现多数据源的方法
使用Spring Boot和JPA实现多数据源的方法
48 0
|
3月前
|
Java 数据库连接 数据库
【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地
Mybatis是一个基于JDBC实现的,支持普通 SQL 查询、存储过程和高级映射的优秀持久层框架,去掉了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。 Mybatis主要思想是将程序中大量的 SQL 语句剥离出来,配置在配置文件中,以实现 SQL 的灵活配置。在所有 ORM 框架中都有一个非常重要的媒介——PO(持久化对象),PO 的作用就是完成持久化操作,通过该对象对数据库执行增删改的操作,以面向对象的方式操作数据库。
44 1
【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地
|
3月前
|
Java 数据库
Springboot 之 Mybatis-plus 多数据源
Springboot 之 Mybatis-plus 多数据源
47 0
|
3月前
|
Java 数据库连接 数据库
Springboot 之 JDBC 多数据源实现
Springboot 之 JDBC 多数据源实现
54 0
|
3月前
|
Java 数据库 微服务
Springboot 之 JPA 多数据源实现
Springboot 之 JPA 多数据源实现
130 0