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

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

目录
相关文章
|
5天前
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
5天前
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
40 3
|
5天前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
5天前
|
druid Java 数据库连接
SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
49 0
|
5天前
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
33 2
|
5天前
|
JavaScript Java Apache
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析
305 0
|
5天前
|
存储 Java 关系型数据库
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
springboot整合多数据源的配置以及动态切换数据源,注解切换数据源
86 0
QGS
|
5天前
|
Java 关系型数据库 MySQL
手拉手springboot3整合mybatis-plus多数据源
手拉手springboot3整合mybatis-plus多数据源
QGS
99 1
|
5天前
|
前端开发 Java 数据库连接
Spring Boot常见企业开发场景应用、自动配置原理结构分析(一)
Spring Boot常见企业开发场景应用、自动配置原理结构分析
|
5天前
|
Java 数据库 数据安全/隐私保护
使用Spring Boot和JPA实现多数据源的方法
使用Spring Boot和JPA实现多数据源的方法
75 0