java - Spring Boot,具有多个 Hikari 数据源和单个数据源配置 Java 文件的 Spring Data JPA
问题描述
如何使用 application.properties 中提到的多个数据源配置创建单个配置 java 文件,以便在添加任意“n”个数据源的同时。它必须使用相同的配置文件自动处理所有数据源。
此外,所有数据源都必须使用相同的 JPARepository 来查询数据。另外,我想创建一个实体管理器列表来对特定数据源执行特定操作。
应用程序属性
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
站点配置.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 设为通用类,并为每个案例创建一个单独的数据源和实体管理器。
它应该自动从 application.properites 中获取数据源的数量,并且应该配置属性文件中提到的所有数据源。
此外,每个数据源都必须使用相同的 JPARepository。
解决方案
据我了解,您需要根据您在application.properties中声明的站点数量创建“N”个数据源。我看到的唯一方法是您的DataSource bean应该是动态创建的,而不是静态地绑定到您的 application.properties。
在 Spring 中有一种结合使用“ConfigurableBeanFactory”和“BeanFactoryAware”的方法。
StackOverflow 中已经有一个答案:这里
希望这可以帮助
推荐阅读
- angular - Angular 库在使用时未运行 ngOnInit
- hyper-v - 创建可引导 UEFI ISO
- java - 使用 MyEclipse 生成 Spring REST Web 服务
- c - 分段错误处理程序中的分段错误
- sbt - 我需要将我的 SBT 插件交叉构建到 1.0 和 1.1 吗?
- c++ - 成员函数,它在自身内部返回一个双重嵌套类,该类继承自从自身继承的类
- javascript - React-native button press performs 2 out of 3 Firebase database updates
- android - ConstraintLayout:无法缩放图像以适应 ListView 中的比例
- c++ - 为什么在这个 C++ 程序中添加负整数会导致正整数?
- sql - 如何从 SQL 生成大量表?