SpringBoot配置多数据源启动失败问题求助
解决SpringBoot多PostgreSQL数据源配置问题
1. 修复Repository Bean找不到的问题
确保每个数据源的配置类通过@EnableJpaRepositories明确指定对应Repository的扫描路径,同时绑定专属的EntityManagerFactory和TransactionManager:
// Pims数据源配置类 @Configuration @EnableJpaRepositories( basePackages = "com.clubtravel.powwow.repositories.pims", entityManagerFactoryRef = "pimsEntityManagerFactory", transactionManagerRef = "pimsTransactionManager" ) public class PimsDataSourceConfig { // 后续配置写在这里 } // Powwow数据源配置类 @Configuration @EnableJpaRepositories( basePackages = "com.clubtravel.powwow.repositories.powwow", entityManagerFactoryRef = "powwowEntityManagerFactory", transactionManagerRef = "powwowTransactionManager" ) public class PowwowDataSourceConfig { // 后续配置写在这里 }
2. 修复pimsEntityManager找不到的问题
需要为每个数据源完整配置DataSource、EntityManagerFactory和TransactionManager:
配置Pims数据源
@Bean @ConfigurationProperties(prefix = "spring.datasource.pims") public DataSource pimsDataSource() { return DataSourceBuilder.create().build(); } @Bean public LocalContainerEntityManagerFactoryBean pimsEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(pimsDataSource()) .packages("com.clubtravel.powwow.entities.pims") // 指定Pims实体类所在包 .persistenceUnit("pims") .build(); } @Bean public PlatformTransactionManager pimsTransactionManager( @Qualifier("pimsEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); }
配置Powwow数据源(同理)
@Bean @ConfigurationProperties(prefix = "spring.datasource.powwow") public DataSource powwowDataSource() { return DataSourceBuilder.create().build(); } @Bean public LocalContainerEntityManagerFactoryBean powwowEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(powwowDataSource()) .packages("com.clubtravel.powwow.entities.powwow") // 指定Powwow实体类所在包 .persistenceUnit("powwow") .build(); } @Bean public PlatformTransactionManager powwowTransactionManager( @Qualifier("powwowEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); }
注意:如果其中一个数据源是主数据源,需要在对应的DataSource、EntityManagerFactory、TransactionManager Bean上添加
@Primary注解,避免Spring自动装配时冲突。
3. 修复@Transactional无效的问题
使用@Transactional时需要指定对应的事务管理器名称,否则Spring会使用默认的事务管理器,导致无法匹配到对应数据源:
// Pims仓库的DAO方法示例 @Transactional("pimsTransactionManager") public Lob findLobById(Long id) { // 业务逻辑 } // Powwow仓库的DAO方法示例 @Transactional("powwowTransactionManager") public User findUserById(Long id) { // 业务逻辑 }
配置文件补充
确保application.properties/application.yml中正确配置两个数据源的参数:
# Pims数据源 spring.datasource.pims.url=jdbc:postgresql://localhost:5432/pims_db spring.datasource.pims.username=your_username spring.datasource.pims.password=your_password spring.datasource.pims.driver-class-name=org.postgresql.Driver # Powwow数据源 spring.datasource.powwow.url=jdbc:postgresql://localhost:5432/powwow_db spring.datasource.powwow.username=your_username spring.datasource.powwow.password=your_password spring.datasource.powwow.driver-class-name=org.postgresql.Driver
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

