首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据资源之间的多租户动态切换无法工作。

数据资源之间的多租户动态切换无法工作。
EN

Stack Overflow用户
提问于 2018-11-22 07:32:24
回答 1查看 341关注 0票数 1

我正试图在我的spring引导应用程序中实现多租户。我指的是"http://anakiou.blogspot.com/2015/08/multi-tenant-application-with-spring.html“的例子。在这个例子中,一切都很好。但是在我的代码中,没有发生数据源之间的切换。

在我的DataSourceConfig.java中,我面临着声明3个Beans的问题,所以我使用@Primary注释。如果删除@主批注,就会出现以下错误

代码语言:javascript
复制
' 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注释,而不管租户身份如何,那么它将数据存储在带有@Primary注解的DataSource中。因此,DataSource的转换并没有发生。

这是我的DataSourceConfig课

代码语言:javascript
复制
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();
}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-27 09:49:21

禁用Spring的DataSourceAutoConfiguration并提供我们的多租户DataSourceConfig。这将从MultitenancyProperties加载属性,而application.properties又对其进行配置,并相应地配置数据源。要排除DataSourceAutoConfiguration使用@EnableAutoConfiguration

代码语言:javascript
复制
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53425899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档