hibernate - 多数据源配置和使用 hikari 在 sping boot 2 中的使用
问题描述
我已经使用 spring boot 配置了两个 Postgres 数据库,但是 spring 总是对主数据库进行拍照并忽略辅助数据库,任何帮助将不胜感激。
下面是我的配置
应用程序属性
#datasource 1
spring.datasource.url= jdbc:postgresql://localhost:5432/db1
spring.datasource.username=user1
spring.datasource.password=user1
#data source 2
spring.datasource2.url= jdbc:postgresql://localhost:5432/db2
spring.datasource2.username=user2
spring.datasource2.password=user2
数据源 1 的配置如下我在数据源 1 中有多个存储库和实体,这是我的主要数据源。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManager",
transactionManagerRef = "primaryTransactionManager",
basePackages = {"pkg.user_service.repository","pkg.master.repository","pkg.Wallet.repository","pkg.security.repositories",
"pkg.product_service.repository","pkg.OMS.repository","pkg.LMS.repository","pkg.payment.repository"}
)
public class DataSource1_config {
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public HikariDataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
.build();
}
@Primary
@Bean(name = "primaryEntityManager")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource(null))
.packages("pkg")
.persistenceUnit("primaryPU")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManager") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
datsource2 的配置如下,数据源 2 中有单个存储库和实体。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "secondEntityManager",
transactionManagerRef = "secondTransactionManager",
basePackages = {"device_info.repository"}
)
public class DataSource2_config {
@Bean
@ConfigurationProperties(prefix = "spring.datasource2")
public HikariDataSource secondSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
.build();
}
@Bean(name = "secondEntityManager")
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondSource(null))
.packages(User_Device_Info.class)
.persistenceUnit("secondPU")
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager secondTransactionManager(@Qualifier("secondEntityManager") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
解决方案
我已经完成了一个项目,我可以使用您的特定更改集创建多个数据源,因此如果您需要添加另一个数据源,它只会更改您的 application.yml,不再需要更改代码。
配置类
@Configuration
@ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(LiquibaseProperties.class)
@AllArgsConstructor
public class LiquibaseConfiguration {
private LiquibaseProperties properties;
private DataSourceProperties dataSourceProperties;
@Bean
@DependsOn("tenantRoutingDataSource")
public MultiTenantDataSourceSpringLiquibase liquibaseMultiTenancy(Map<Object, Object> dataSources,
@Qualifier("taskExecutor") TaskExecutor taskExecutor) {
// to run changeSets of the liquibase asynchronous
MultiTenantDataSourceSpringLiquibase liquibase = new MultiTenantDataSourceSpringLiquibase(taskExecutor);
dataSources.forEach((tenant, dataSource) -> liquibase.addDataSource((String) tenant, (DataSource) dataSource));
dataSourceProperties.getDataSources().forEach(dbProperty -> {
if (dbProperty.getLiquibase() != null) {
liquibase.addLiquibaseProperties(dbProperty.getTenantId(), dbProperty.getLiquibase());
}
});
liquibase.setContexts(properties.getContexts());
liquibase.setChangeLog(properties.getChangeLog());
liquibase.setDefaultSchema(properties.getDefaultSchema());
liquibase.setDropFirst(properties.isDropFirst());
liquibase.setShouldRun(properties.isEnabled());
return liquibase;
}
}
应用程序.yml
spring:
dataSources:
- tenantId: db1
url: jdbc:postgresql://localhost:5432/db1
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
liquibase:
enabled: true
default-schema: public
change-log: classpath:db/master/changelog/db.changelog-master.yaml
- tenantId: db2
url: jdbc:postgresql://localhost:5432/db2
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
- tenantId: db3
url: jdbc:postgresql://localhost:5432/db3
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
完整查看代码:https ://github.com/dijalmasilva/spring-boot-multitenancy-datasource-liquibase
推荐阅读
- google-apps-script - TypeError:无法设置未定义的属性“frozenRowCount”(第 6 行,文件“Header-Row-Frozen”)
- sql - 如何在同一个 SQL 查询中组合子句 LIKE 和 BETWEEN?
- php - 如何配置现有的 Apache 2 服务器以使用 PHP?
- python - 为什么我的代码说名称“计数”未定义
- c++ - C ++如何从指针数组访问子类虚函数
- android - AAPT:错误:找不到属性 cardcornerRadius 错误
- image-processing - 你能在卷积神经网络中加入强化学习来改善图像分类吗?
- firebase-realtime-database - 空对象引用 FireBase 通过用户名登录
- amazon-web-services - 由 S3 支持的 CloudFront 使用中间 HTTP 重定向,甚至来自 HTTPS
- c++ - 打印功能的意外输出