Spring Boot应用未使用JPA时如何正确配置双JDBC数据源
问题根因
PostgreSQL数据源的配置类未正确绑定专属配置前缀,Spring读取了带@Primary注解的H2数据源的配置注入到PG数据源中,导致驱动类异常。
修复步骤
- 第一步:确保application.properties中两个数据源的配置前缀完全独立,不要共用
spring.datasource前缀,示例配置如下:
# H2主数据源配置 spring.datasource.h2.jdbc-url=jdbc:h2:mem:testdb spring.datasource.h2.username=sa spring.datasource.h2.password= spring.datasource.h2.driver-class-name=org.h2.Driver # PostgreSQL数据源配置 spring.datasource.pg.jdbc-url=jdbc:postgresql://localhost:5432/your_db spring.datasource.pg.username=postgres spring.datasource.pg.password=your_pg_pass spring.datasource.pg.driver-class-name=org.postgresql.Driver
注意自定义数据源绑定需要使用jdbc-url属性,不能用url,否则配置无法被正确识别。
- 第二步:修正H2数据源配置类,绑定对应前缀,@Primary注解保留:
@Configuration public class H2DataSourceConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.h2") public DataSource dataSourceH2() { return DataSourceBuilder.create().build(); } }
- 第三步:修正PostgreSQL数据源配置类,绑定PG专属前缀:
@Configuration public class PgDataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.pg") public DataSource dataSourcePg() { return DataSourceBuilder.create().build(); } }
如果担心配置绑定失效,也可以手动显式指定PG数据源的所有参数:
@Bean public DataSource dataSourcePg() { return DataSourceBuilder.create() .driverClassName("org.postgresql.Driver") .url("jdbc:postgresql://localhost:5432/your_db") .username("postgres") .password("your_pg_pass") .build(); }
- 可选排查:如果修改后仍存在问题,可在启动类排除Spring Boot自带的数据源自动配置,避免默认配置干扰:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
验证
启动项目后注入dataSourcePg实例,调用getDriverClassName()方法,返回值为org.postgresql.Driver即为配置成功。
内容的提问来源于stack exchange,提问作者monos
相关产品推荐
相关产品推荐

