java - Multi-Tenancy 数据源之间的动态切换不起作用

标签 java spring spring-boot multi-tenant spring-config

我正在尝试在我的 Spring Boot 应用程序中实现 Multi-Tenancy 。我指的是“http://anakiou.blogspot.com/2015/08/multi-tenant-application-with-spring.html ”示例。在此示例中,一切正常。但在我的代码中,数据源之间的切换没有发生。

在我的 DataSourceConfig.java 中,我面临着声明 3 个 Bean 的问题,所以我使用 @Primary 注释。如果我删除 @Primary 注释,我会收到以下错误

' Parameter 1 of method liquibase in com.config.DatabaseConfiguration required a single bean, but 3 were found:
- dataSource: defined by method 'dataSource1' in class path resource [com/config/DataSourceConfig.class]
- dataSource2: defined by method 'dataSource2' in class path resource [com/config/DataSourceConfig.class]
- dataSource3: defined by method 'dataSource3' in class path resource [com/config/DataSourceConfig.class] ' 

但是,如果我使用 @Primary 注释,无论租户 id 是什么,它都会将数据存储在用 @Primary 注释的 DataSource 中。所以数据源的切换没有发生。

这是我的 DataSourceConfig 类

package com.config;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.netflix.governator.annotations.binding.Secondary;

@Configuration
public class DataSourceConfig {

@Autowired
private MultitenancyProperties multitenancyProperties;

@Primary
@Bean(name =  {"dataSource" , "dataSource1"})
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
public DataSource dataSource1() {
    DataSourceBuilder factory = DataSourceBuilder
            .create(this.multitenancyProperties.getDatasource1().getClassLoader())
            //.driverClassName(this.multitenancyProperties.getDatasource1().getDriverClassName())
            .username(this.multitenancyProperties.getDatasource1().getUsername())
            .password(this.multitenancyProperties.getDatasource1().getPassword())
            .url(this.multitenancyProperties.getDatasource1().getUrl());
    return factory.build();
}


@Bean(name = {"dataSource2"})
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource2(@Qualifier("dataSource1") DataSource dataSource1) {
    System.out.println("Entered to 2");
    DataSourceBuilder factory = DataSourceBuilder
            .create(this.multitenancyProperties.getDatasource2().getClassLoader())
            //.driverClassName(this.multitenancyProperties.getDatasource2().getDriverClassName())
            .username(this.multitenancyProperties.getDatasource2().getUsername())
            .password(this.multitenancyProperties.getDatasource2().getPassword())
            .url(this.multitenancyProperties.getDatasource2().getUrl());
    return factory.build();
}


@Bean(name = {"dataSource3"})
@ConfigurationProperties(prefix = "spring.datasource.datasource3")
public DataSource dataSource3() {
    DataSourceBuilder factory = DataSourceBuilder
            .create(this.multitenancyProperties.getDatasource3().getClassLoader())
            //.driverClassName(this.multitenancyProperties.getDatasource3().getDriverClassName())
            .username(this.multitenancyProperties.getDatasource3().getUsername())
            .password(this.multitenancyProperties.getDatasource3().getPassword())
            .url(this.multitenancyProperties.getDatasource3().getUrl());
    return factory.build();
}}

最佳答案

禁用Spring的DataSourceAutoConfiguration并提供我们的 Multi-Tenancy DataSourceConfig。这将从 MultitenancyProperties 加载属性,而该属性又由 application.properties 配置并相应地配置我们的数据源。要排除 DataSourceAutoConfiguration 使用 @EnableAutoConfiguration

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})

关于java - Multi-Tenancy 数据源之间的动态切换不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53425899/

相关文章:

java - 字符错误 "char cannot be converted to string"

java - 使用 Java 创建 Snake

spring - 不使用 block()/blockFirst()/blockLast() 将单声道转换为对象 java

java - 具有 Html 页面和 Rest Web 服务身份验证的 Spring Security

java - Hibernate PreInsertEventListener 修改的字段在 Spring Boot 存储库 POST 响应 JSON 中显示为 null

Spring boot 和 JPA 事务不起作用

用于比较数组位置的Java函数?

java - 非映射属性的 Hibernate 标准

java - 使用 Apache Camel 和 ActiveMQ 时如何处理系统崩溃

java - Springboot 关闭 Hook 无法与 Windows TaskKill 一起使用