【问题标题】:Configuring multiple azure sql databases in spring boot在spring boot中配置多个azure sql数据库
【发布时间】:2021-12-23 20:19:21
【问题描述】:

我正在尝试配置两个使用相同 azure sql 用户名/密码但 url/数据库不同的数据源。我正在使用@Primary 注释并将数据访问层拆分到它们自己的文件夹中,但只有没有@Primary 的配置会被配置。

数据源1:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PAKAGE,
entityManagerFactoryRef = Constants.ENTITY_MANAGER_FACTORY,
transactionManagerRef= Constants.TRANSACTION_MANAGER)
public class DataSourceConfiguration {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    public DataSourceConfiguration(Environment environment) {
        this.environment = environment;
    }
    private Environment environment;

    @Primary
    @Bean
    public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
        return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
    }
   
    @Primary
    @Bean(name = Constants.ENTITY_MANAGER_FACTORY)
    public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
            EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource1.dialect"));
        return builder
                .dataSource(dataSource())
                .packages(Constants.ENTITY_PATH)
                .properties(properties)
                .build();
    }
    @Primary
    @Bean
    public PlatformTransactionManager sqlserverTransactionManager(
            final @Qualifier(Constants.ENTITY_MANAGER_FACTORY) LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
        return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
    }

    @Primary
    @Bean
    protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(environment.getProperty("sqlserver.datasource1.driver"));
        config.setJdbcUrl(this.buildSnowflakeJDBCUrl());
        config.setUsername(environment.getProperty("sqlserver.datasource1.username"));
        config.setPassword(environment.getProperty("sqlserver.datasource1.password"));
        HikariDataSource dataSource = new HikariDataSource(config);
        return dataSource;
    }

    private String buildSnowflakeJDBCUrl() {
        StringBuilder url = new StringBuilder();
        url.append(environment.getProperty("sqlserver.datasource1.url"));
        return url.toString();
    }
   
}

和数据源2:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PACKAGE2,
        entityManagerFactoryRef = "sqlserver2EntityManagerFactory",
        transactionManagerRef= "sqlserver2TransactionManager")
public class DataSourceConfiguration2 {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    public PhDataSourceConfiguration(Environment environment) {
        this.environment = environment;
    }
    private Environment environment;

    @Bean
    public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
        return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
    }

    @Bean(name = "sqlserver2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
            EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource2.dialect"));
        return builder
                .dataSource(dataSource())
                .packages(Constants.ENTITY_PATH2)
                .properties(properties)
                .build();
    }

    @Bean(name = "sqlserver2TransactionManager")
    public PlatformTransactionManager sqlserverTransactionManager(
            final @Qualifier("sqlserver2EntityManagerFactory") LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
        return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
    }

    @Bean
    protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(environment.getProperty("sqlserver.datasource2.driver"));
        config.setJdbcUrl(this.buildJDBCUrl());
        config.setUsername(environment.getProperty("sqlserver.datasource2.username"));
        config.setPassword(environment.getProperty("sqlserver.datasource2.password"));
        HikariDataSource dataSource = new HikariDataSource(config);
        return dataSource;
    }

    private String buildJDBCUrl() {
        StringBuilder url = new StringBuilder();
        url.append(environment.getProperty("sqlserver.datasource2.url"));
        return url.toString();
    }

}

这是一个问题,因为它们都从相同的用户/密码读取 azure sql 吗?我怎样才能让这两个配置都工作?

【问题讨论】:

  • 一些 bean 名称重叠(如果未指定,则使用方法名称),因此最后处理的 @Bean 将获胜。尝试显式命名 bean,@Qualifier 在需要的地方注入正确的 bean 实例。
  • 你说的对,谢谢!!!

标签: java sql-server spring-boot jpa azure-sql-database


【解决方案1】:

谢谢Andrew S。发布您的建议作为帮助其他社区成员的答案。

一些bean名称重叠(如果没有使用方法名称 指定),所以最后处理的@Bean 将获胜。明确尝试 命名 bean,并 @Qualifier 注入正确的 bean 实例 需要的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2017-08-10
    • 2019-02-03
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多