使用SpringBoot的动态数据源

时间:2019-07-26 17:35:44

标签: java spring-boot dynamic datasource

我正在使用SpringBoot编写微服务,我需要动态选择数据源。我将基于该参数选择数据源。每个数据源将指向具有相同架构(相同的表,触发器,存储过程等)的Oracle数据库。如何执行此要求?

4 个答案:

答案 0 :(得分:0)

我确实实现了类似的方法...

我使用 application.properties 存储数据源连接

Datasource drive name
spring.datasource.driver-class-name=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

有一些关于如何读取和写入属性的代码示例

https://github.com/evandbrown/amediamanager/blob/d42228a924cfbf14832e774a77c03eb0e9c2dba1/src/main/java/com/amediamanager/config/ConfigurationProviderChain.java

创建一个端点以更新您的属性

@PutMapping("/update")
    public ResponseEntity<?> updateConnection(@RequestBody final List<ConfigurationProperty> properies) {
        LOGGER.trace("Updating data source properties ");
        for (final ConfigurationProperty configurationProperty : properies) {
            config.getConfigurationProvider().persistDatabaseProperty(configurationProperty.getPropertyName(),
                    configurationProperty.getPropertyValue());
        }

            }
        }
        return new ResponseEntity<> (HttpStatus.OK);
    }

从经验中获得的另一个技巧是在执行更新端点之前ping连接。 :) 关于我的实现的唯一结论是,用户将需要重新启动服务器以对提取进行更改。

答案 1 :(得分:0)

在启动时配置所有数据源,然后:

要么:

a。有一个实现每个数据源的不同的repo类,请在调用相应的repo之前检查参数。

b。有一个repo类可以检查参数并使用相应的数据源进行查询。

答案 2 :(得分:0)

您必须在application.properties中实现两个配置数据源,然后配置两个EntityManagerFactory和TransactionManager。您可以为每个数据源使用不同的存储库在两个数据源之间进行切换。

application.properties

first.datasource.url=jdbc:oracle:thin:@//host:1521/firstdb
first.datasource.username=first
first.datasource.password=first
first.datasource.driver-class-name=oracle.jdbc.OracleDriver

second.datasource.url=jdbc:oracle:thin:@//host:1521/firstdb
second.datasource.username=second
second.datasource.password=second
second.datasource.driver-class-name=oracle.jdbc.OracleDriver

spring.jpa.database=default

每个实体和存储库有两个软件包,还有两个配置要设置。

第一

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactory",
  basePackages = { "com.system.first.repo" }
)
public class FirstDbConfig {

  @Primary
  @Bean(name = "dataSource")
  @ConfigurationProperties(prefix = "first.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean 
  entityManagerFactory(
    EntityManagerFactoryBuilder builder,
    @Qualifier("dataSource") DataSource dataSource
  ) {
    return builder
      .dataSource(dataSource)
      .packages("com.system.first.domain")
      .persistenceUnit("first")
      .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
    @Qualifier("entityManagerFactory") EntityManagerFactory 
    entityManagerFactory
  ) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

第二:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "secondEntityManagerFactory",
  transactionManagerRef = "secondTransactionManager",
  basePackages = { "com.system.second.repo" }
)
public class SecondDbConfig {

  @Bean(name = "secondDataSource")
  @ConfigurationProperties(prefix = "second.datasource")
  public DataSource dataSource() {
    return DataSourceBuilder.create().build();
  }

  @Bean(name = "secondEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean 
  secondEntityManagerFactory(
    EntityManagerFactoryBuilder builder,
    @Qualifier("secondDataSource") DataSource dataSource
  ) {
    return
      builder
        .dataSource(dataSource)
        .packages("com.system.second.domain")
        .persistenceUnit("second")
        .build();
  }
  @Bean(name = "secondTransactionManager")
  public PlatformTransactionManager secondTransactionManager(
    @Qualifier("secondEntityManagerFactory") EntityManagerFactory
    secondEntityManagerFactory
  ) {
    return new JpaTransactionManager(secondEntityManagerFactory);
  }
}

答案 3 :(得分:0)

在springboot中尝试这个AbstractRoutingDataSource。

https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

相关问题