Spring boot Spring启动-每个租户连接两个架构

Spring boot Spring启动-每个租户连接两个架构,spring-boot,spring-data-jpa,multi-tenant,Spring Boot,Spring Data Jpa,Multi Tenant,我正在创建一个Spring boot多模块应用程序,其中一个模块有独特的需求。模块应该能够连接到一个固定模式,比如S1,还有两个模式S2和S3。 根据区域的不同,它将连接到S1和S2或S1和S3 在这里我必须遵循多租户方法吗 如果是,我如何使用多租户连接到特定请求的两个架构?根据我的理解,您希望连接到基于国家/地区的不同数据库。我的项目中也有类似的问题 我的要求是,当有json请求时,我需要从该请求中获取国家代码,并基于该请求,我将连接到特定于该国家的数据库。下面是我的代码。希望这对你有帮助 应

我正在创建一个Spring boot多模块应用程序,其中一个模块有独特的需求。模块应该能够连接到一个固定模式,比如S1,还有两个模式S2和S3。 根据区域的不同,它将连接到S1和S2或S1和S3

在这里我必须遵循多租户方法吗


如果是,我如何使用多租户连接到特定请求的两个架构?

根据我的理解,您希望连接到基于国家/地区的不同数据库。我的项目中也有类似的问题

我的要求是,当有json请求时,我需要从该请求中获取国家代码,并基于该请求,我将连接到特定于该国家的数据库。下面是我的代码。希望这对你有帮助

应用程序属性

spring.main.web-application-type=none
#spring.main.allow-bean-definition-overriding=true

#au DB connection
spring.datasource.au.url=
spring.datasource.au.username=
spring.datasource.au.password=

#cn DB connection
spring.datasource.cn.url=
spring.datasource.cn.username=
spring.datasource.cn.password=


spring.jpa.show-sql=true
spring.jpa.database=default
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
数据库配置

非盟: 这里我使用@Primary注释来表示AU

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "auEntityManagerFactory", transactionManagerRef = "auTransactionManager", basePackages = "com.dbs.multiDb.au.repository")
@EnableTransactionManagement
public class auDsConfig {

    Logger logger = LogManager.getLogger(this.getClass());
    @Autowired
    Environment env;

    @Bean(name = "auEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean cnEntityManagerFactory(final EntityManagerFactoryBuilder builder,
            final @Qualifier("au-db") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.dbs.multiDb.domain").persistenceUnit("auDb")
                .properties(singletonMap("hibernate.hbm2ddl.auto", "none")).build();
    }

    @Bean(name = "auTransactionManager")
    @Primary
    public PlatformTransactionManager auTransactionManager(
            @Qualifier("auEntityManagerFactory") EntityManagerFactory cnEntityManagerFactory) {
        return new JpaTransactionManager(cnEntityManagerFactory);
    }

    @SuppressWarnings("unused")
    @Bean(name = "au-db")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.au")
    public DataSource auDataSource() {
        DriverManagerDataSource dbFinal = new DriverManagerDataSource();
        dbFinal.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dbFinal.setUrl(env.getProperty("spring.datasource.au.url"));
        dbFinal.setUsername(env.getProperty("spring.datasource.au.username"));
        dbFinal.setPassword(env.getProperty("spring.datasource.au.password"));

        return dbFinal;
    }

}
CN数据库配置:

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "cnEntityManagerFactory", transactionManagerRef = "cnTransactionManager", basePackages = "com.dbs.multiDb.cn.repository")
@EnableTransactionManagement
public class cnDsConfig {

    @Bean(name = "cnEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean cnEntityManagerFactory(final EntityManagerFactoryBuilder builder,
            final @Qualifier("cn-db") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.dbs.multiDb.domain").persistenceUnit("cnDb")
                .properties(singletonMap("hibernate.hbm2ddl.auto", "none")).build();
    }

    @Bean(name = "cnTransactionManager")
    public PlatformTransactionManager cnTransactionManager(
            @Qualifier("cnEntityManagerFactory") EntityManagerFactory cnEntityManagerFactory) {
        return new JpaTransactionManager(cnEntityManagerFactory);
    }

    @Bean(name = "cn-db")
    @ConfigurationProperties(prefix = "spring.datasource.cn")
    public DataSource cnDataSource() {
        DriverManagerDataSource dbFinal = new DriverManagerDataSource();
        dbFinal.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dbFinal.setUrl(env.getProperty("spring.datasource.cn.url"));
        dbFinal.setUsername(env.getProperty("spring.datasource.cn.username"));
        dbFinal.setPassword(env.getProperty("spring.datasource.cn.password"));

        return dbFinal;
    }
}
为两国创建了回购协议:

非盟回购:

@Repository
public interface AURepository extends CrudRepository<BeanName,String>{

}
@存储库
公共界面Auresitory扩展CrudResitory{
}
中国回购:

@Repository
public interface CNRepository extends CrudRepository<BeanName,String>{
}
@存储库
公共接口CNRepository扩展了Crudepository{
}
服务类别:

 @Service
    public class ServiceClass{

        private AURepository auTxn;

        private CNRepository cnTxn;


        @Autowired
        public ServiceClass(AURepository auTxn, CNRepository cnTxn) {
            super();
            this.auTxn = auTxn;
            this.cnTxn = cnTxn;
        }

        public List<Bean> getData(String input, String country) {
            List<Bean> data= new ArrayList<Bean>();
            //If this is AU then it will connect to AU DB and retrieve data.
            if (country.equals("AU")) {
                data= auTxn.findall();
            }
            //If this is CN then it will connect to AU DB and retrieve data.
            else if (country.equals("CN")) {
                data= cnTxn.findall();
            }
            return data;
        }
    }
@服务
公共类服务类{
私人金黄色auTxn;
私有CNXN;
@自动连线
公共服务类(金色auTxn、CNXN){
超级();
this.auTxn=auTxn;
this.cnTxn=cnTxn;
}
公共列表getData(字符串输入,字符串国家/地区){
列表数据=新的ArrayList();
//如果这是AU,那么它将连接到AU DB并检索数据。
if(国家等于(“AU”)){
data=auTxn.findall();
}
//如果这是CN,那么它将连接到AU DB并检索数据。
如果(国家等于(“CN”)){
data=cnTxn.findall();
}
返回数据;
}
}