当前位置: 首页 > 知识库问答 >
问题:

如何在Spring boot应用程序中动态注入和使用多个数据源?

乐正涵忍
2023-03-14

我有这些档案,uat nyc,uat ldn。uat nyc数据源是oracle,uat ldn是mysql服务器。此配置在uat nyc应用程序中设置。yml和应用uat ldn。yml公司

我有以下配置类

    @Profile({"uat-nyc", "uat-ldn"})
    @Configuration
    @EnableConfigurationPropeties(DatSourceProperties.class)
    public class DataSourceConfig{

    private DataSourceProperties properties; // server, username, password are set here
    

    DataSource getDataSource(){// gets datasource based on profiles}
    
    }

如果我的应用程序是用spring运行的。配置文件。活动:uat nyc,uat ldn是否会创建两个数据源?

一个配置来自uat nyc,另一个配置来自uat ldn

我在下面有一个函数,在这个函数中,我从第三方服务获取数据,并且根据“如果”或“纽约”,我需要持久化到“如果”或“纽约”数据库。如何使下面的“如果”部分动态?如何在下面的getProducts方法的“如果”部分中获取各自的数据源,即“如果”和“纽约”?

 class Product{
       String name;
       int price;
       int region;
    }
    
     @Component
     Class ProductLoader{

        JdbcTemplate jdbcTemplate;
        
         public ProductLoader(DataSource ds){
            
                 jdbcTemplate = new JdbcTemplate(ds);
         }
    
        public void getProducts(){
             List<Product> products = // rest service to get products
             if(Product product : product){
                          if(product.getRegion().equals("LONDON"){
                            //write to LONDON datbase
                           // How can I get ldn datasource here?
                          }
                          if else(product.getRegion().equals("NewYork"){
                               //write to NewYork datbase
                               How can I get NewYork datasource here? 
                          }
                          else{
                               // Unknown location
                          }
             }

 
    }
}

问题-

  1. 如果我的应用程序是用spring运行的。配置文件。活动:uat nyc,uat ldn是否会创建两个数据源
  2. 如何将数据源动态注入ProductLoader并为ldn和nyc使用特定的数据源

共有1个答案

陶温书
2023-03-14

第一次,您需要告诉spring您将使用两个数据源,它们将由context spring管理。在@配置类上使用@Bean,然后使用@Autowired来声明spring管理的变量。

您可以使用@Qualifier来选择和限定您的bean

@Configuration
public class ConfigDataSource {


    // example for dataSource
    
    @Bean("dataSourceWithPropOnCode") // this name will qualify on @autowired
    public DataSource dataSourceWithPropOnCode() {
        return DataSourceBuilder.create().url("").password("").username("").driverClassName("").build();
    }

    @Bean("dataSourceWithPropFromProperties")  // this name will qualify on @autowired
    @ConfigurationProperties(prefix="spring.datasource.yourname-datasource") // this is the name for the prefix for datasource on .properties settings
    public DataSource dataSourcePostgres() {
        return DataSourceBuilder.create().build();
    }

    // example for jdbctemplate
    
    @Bean("jdbcTemaplateWithPropFromProperties")  // this name will qualify on @autowired
    public JdbcTemplate jdbcTemplatePostgres(@Qualifier("dataSourceWithPropFromProperties") DataSource dataSource) {
     return new JdbcTemplate(dataSource);
    }
    
    @Bean("jdbcTemaplateWithPropOnCode")  // this name will qualify on @autowired
    public JdbcTemplate jdbcTemplatePostgres(@Qualifier("dataSourceWithPropOnCode") DataSource dataSource) {
     return new JdbcTemplate(dataSource);
    }
    
    
}

属性设置


spring.datasource.yourname-datasource.url=...
spring.datasource.yourname-datasource.jdbcUrl=${spring.datasource.yourname-datasource}
spring.datasource.yourname-datasource.username=user
spring.datasource.yourname-datasource.password=pass
spring.datasource.yourname-datasource.driver-class-name=your.driver


在服务上使用


    @Qualifier("jdbcTemaplateWithPropFromProperties")
    @Autowired
    private JdbcTemplate jdbcTemplate1;
    
    @Qualifier("jdbcTemaplateWithPropOnCode")
    @Autowired
    private JdbcTemplate jdbcTemplate2;
    
    @Qualifier("dataSourceWithPropOnCode")
    @Autowired
    private DataSource dataSource1;
    
    private DataSource dataSource2;
    
    public someContructorIfYouPrefer(@Qualifier("dataSourceWithPropFromProperties") @Autowired private DataSource dataSource2){
        this.dataSource2 = dataSource2;
    }
    
 类似资料:
  • 我有Kafka Streams java应用程序启动并运行。我试图使用KSQL创建简单的查询,并使用Kafka流来实现复杂的解决方案。我希望将KSQL和Kafka流作为Java应用程序运行。 我打算通过https://github.com/confluentinc/ksql/blob/master/ksqldb-examples/src/main/java/io/confluent/ksql/em

  • 在我的应用程序中,我需要使用两个MongoDB数据库。我不知道如何在应用程序中添加2个MongoDB数据库。spring应用程序中的属性文件。 这是申请表。我的项目的属性文件, 但是我想为同一个项目使用另一个MongoDB数据库。如何在应用程序中添加新数据库。属性文件。

  • 我正在将当前的应用程序迁移到多租户体系结构。由于只有一个代码库,我需要解决多个租户的问题。我使用的是单数据库、多模式的方法。每个租户将被分配一个单独的模式,其中元数据保存在默认模式中。 应用程序是用ASP构建的。NET MVC。我使用Dapper连接到我的SQL Server。我有50个函数,使用直接查询和存储过程调用数据库。当为每个租户初始化dapper时,是否有任何方法可以在不改变函数的情况下

  • 我们正在使用Firebase实时数据库在flutter中开发一个应用程序,为不同的客户提供多种服务。我想为使用相同Firebase项目的每个客户拥有不同的数据库。由于Firebase在同一个项目中支持多个数据库,我相信可以使用Firebase Datase插件实现。 我试图设置对辅助数据库的引用,但我找不到一个稳定的突击队来更改此数据库的实例。如果您使用的是Java或其他使用Firebase的语言

  • 问题内容: 我尝试使用angular-ui,并尝试注入$ stateProvider: html js(test / appModule.js) 堆栈跟踪 如果我删除带有注释的 $ stateProvider 和 ui.router ,那么一切都会起作用: 那么注入 $ stateProvider 的问题有解决的任何想法吗? PS 我尝试了ui示例,它可以工作,但是我无法弄清楚为什么我的不行。 问

  • 我有一个调度程序,它每 4 小时轮询一次数据,并根据某些逻辑插入到表中。我还使用了注释,并且每次检查表中是否已存在数据。如果记录不存在,它将插入。当我是 SpringBoot 应用程序的多个实例时,每个实例都运行调度程序,并且某些数据并非全部重复。这意味着我发现该表包含重复记录。我插入的表是应用程序的现有表,很少有列没有使用唯一约束进行定义。请告诉我即使调度程序从多个实例运行,如何在数据库表中维护