如何在application.properties中提到如何创建具有多个数据源配置的单个配置Java文件,以便在添加任何n个数据源的同时。它必须使用相同的配置文件自动处理所有数据源。

此外,所有数据源必须使用相同的JPARepository来查询数据。
另外,我想创建一个实体管理器列表,以对特定的数据源执行特定的操作。

application.properties

site1.url=jdbc:postgresql://localhost:4567/postgres
site1.username=someUsername
site1.password=somePassword

site2.url=jdbc:postgresql://localhost:5433/postgres
site2.username=someUsername
site2.password=somePassword


SiteConfiguration.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "site1EntityManager",
        transactionManagerRef = "site1TransactionManager",
        basePackages = "com.someProject.repositoryInterface"
)
public class Site1Config extends HikariConfig {

    @Autowired
    private Environment environment;

    @Primary
    @Bean(name = "site1EntityManager")
    public HikariDataSource mysqlDataSource() {
        setJdbcUrl(environment.getProperty("site1.url"));
        setUsername(environment.getProperty("site1.username"));
        setPassword(environment.getProperty("site1.password"));

        return new HikariDataSource(this);
    }

    @Primary
    @Bean(name = "site1EntityManager")
    public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(mysqlDataSource())
                .packages(ModelClass.class)
                .persistenceUnit("site1PU")
                .build();
    }

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

}


这是单个数据源配置文件的基本示例。
我想使SiteConfiguration成为“ site(Number)”形式的通用类,并为每种情况创建一个单独的数据源,实体管理器。

它应该自动从application.properites中获取数据源的数量,并且应该配置属性文件中提到的所有数据源。

同样,每个数据源都必须使用相同的JPARepository。

最佳答案

据我了解,您需要创建“ N”个数据源,具体取决于您在application.properties中声明的站点数量。
我看到的唯一方法是应动态创建DataSource Bean,而不是将其静态绑定到application.properties。

在Spring中,可以通过结合使用“ ConfigurableBeanFactory”和“ BeanFactoryAware”来实现。

并且在StackOverflow中已经对此有一个答案:Here

希望这可以帮助

07-26 09:27
查看更多