springboot 配置pg多数据源

application.yaml配置

server:
  port: 3038

spring:
  datasource:
    learningdb: 
      jdbcUrl: jdbc:postgresql://localhost:5432/数据库名
      driverClassName: org.postgresql.Driver
      username: username
      password: password
    userdb: 
      jdbcUrl: jdbc:postgresql://localhost:5432/数据库名
      driverClassName: org.postgresql.Driver
      username: username
      password: password

配置类:PgLearningDataSourceConfig


package com.deltaww.dkam.scheduler.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "com.deltaww.dkam.scheduler.repository.pg.mapper.learning", sqlSessionFactoryRef = "pgLearningSqlSessionFactory")
public class PgLearningDataSourceConfig {
	
    @Bean(name = "pgLearningDataSource")
    @ConfigurationProperties("spring.datasource.learningdb")
    public DataSource dbDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "pgLearningSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("pgLearningDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/deltaww/dkam/learning/mapper/*Mapper.xml"));
        return sessionFactoryBean.getObject();
    }
    
    @Bean("pgLearningSqlSessionTemplate")
    public SqlSessionTemplate learningSqlSessionTemplate(@Qualifier("pgLearningSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

package com.deltaww.dkam.scheduler.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;


@Configuration
@MapperScan(basePackages = "com.deltaww.dkam.scheduler.repository.pg.mapper.user", sqlSessionFactoryRef = "pgUserSqlSessionFactory")
public class PgUserDataSourceConfig {
 
    @Bean(name = "pgUserDataSource")
    @ConfigurationProperties("spring.datasource.userdb")
    public DataSource dbDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "pgUserSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("pgUserDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/deltaww/dkam/user/mapper/*Mapper.xml"));
        return sessionFactoryBean.getObject();
    }
    
    @Bean("pgUserSqlSessionTemplate")
    public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("pgUserSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

 

多数据源直接往后加就完事了
 

 

<think>好的,我现在要帮用户解决在Spring Boot中配置PostgreSQL和MySQL两个数据源的问题。首先,我得回忆一下Spring Boot多数据源配置的基本步骤,确保自己理解正确。用户可能对数据源配置不太熟悉,所以需要一步步详细说明,同时注意避免常见错误。 首先,多数据源配置的关键点在于创建不同的DataSource、JdbcTemplate以及事务管理器。需要为每个数据源分别配置属性,然后在代码中定义Bean。接下来,我得考虑用户是否需要同时使用JPA和MyBatis,不过根据问题描述,可能只是基础的JDBC或者JPA配置。这里假设用户使用JPA,可能需要配置不同的EntityManager和TransactionManager。 然后,检查依赖是否正确。对于PostgreSQL和MySQL,需要分别添加对应的JDBC驱动依赖。比如,MySQL是mysql-connector-java,PostgreSQL是postgresql。需要确认用户是否知道在pom.xml或build.gradle中添加这些依赖,或者在回答中给出示例。 接下来是配置文件,比如application.yml或application.properties。需要指导用户如何为两个数据源设置不同的spring.datasource前缀,比如spring.datasource.mysql和spring.datasource.pg。这里需要注意属性名的正确性,比如url、username、password、driver-class-name等。 然后是Java配置部分,需要创建两个配置类,或者在一个配置类中定义两个数据源相关的Bean。需要为每个数据源创建DataSource、EntityManagerFactory、TransactionManager。这里需要特别注意Bean的命名和Qualifier的使用,避免Spring自动配置的冲突。比如,主数据源可能默认使用@Primary注解,但第二个数据源需要明确指定Qualifier。 可能还需要配置JPA的Properties,比如Hibernate的dialect,分别指向MySQL和PostgreSQL的方言,确保Hibernate能正确生成SQL。 另外,事务管理也是一个重点。每个数据源需要有自己对应的事务管理器,并且在Transactional注解中指定使用哪个事务管理器,否则可能出现事务不生效的问题。 还要考虑是否启用JPA的自动配置,可能需要排除默认的自动配置,手动配置两个数据源。比如在启动类上使用@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}),但这样可能需要用户更仔细地处理配置。 测试部分也需要提醒用户,比如写个简单的Repository或者Controller来测试两个数据源是否正常工作,查询数据是否成功。 最后,常见问题可能包括驱动类未正确加载(比如MySQL的driver-class-name是com.mysql.cj.jdbc.Driver,而旧版本可能是com.mysql.jdbc.Driver),或者URL格式错误,比如PostgreSQL的jdbc:postgresql://localhost:5432/db,MySQL的jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC等。 还要检查用户是否可能遇到Bean冲突,比如没有正确使用@Qualifier导致注入错误,或者事务管理器没有正确关联对应的数据源。 总结步骤应该是:添加依赖 → 配置属性 → 创建数据源Bean → 配置JPA和事务 → 测试验证。需要分步骤详细说明,确保用户能一步步跟随操作,避免遗漏关键点。</think>在Spring Boot中配置PostgreSQL和MySQL双数据源需要以下步骤: ### 一、添加依赖 ```xml <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- PostgreSQL --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <!-- JDBC/Spring Data JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` ### 二、配置文件(application.yml) ```yaml # 主数据源配置(MySQL) spring: datasource: mysql: url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC username: root password: mysql123 driver-class-name: com.mysql.cj.jdbc.Driver # 次数据源配置(PostgreSQL) pg: url: jdbc:postgresql://localhost:5432/mypgdb username: postgres password: postgres123 driver-class-name: org.postgresql.Driver # JPA公共配置 jpa: hibernate: ddl-auto: update show-sql: true ``` ### 三、Java配置类 #### 1. MySQL数据源配置 ```java @Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackages = "com.example.repository.mysql", entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager" ) public class MysqlConfig { @Primary @Bean(name = "mysqlDataSource") @ConfigurationProperties(prefix = "spring.datasource.mysql") public DataSource mysqlDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "mysqlEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.entity.mysql") .persistenceUnit("mysql") .properties(jpaProperties()) .build(); } @Primary @Bean(name = "mysqlTransactionManager") public PlatformTransactionManager transactionManager( @Qualifier("mysqlEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } private Map<String, Object> jpaProperties() { HashMap<String, Object> props = new HashMap<>(); props.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); return props; } } ``` #### 2. PostgreSQL数据源配置 ```java @Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackages = "com.example.repository.pg", entityManagerFactoryRef = "pgEntityManagerFactory", transactionManagerRef = "pgTransactionManager" ) public class PgConfig { @Bean(name = "pgDataSource") @ConfigurationProperties(prefix = "spring.datasource.pg") public DataSource pgDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "pgEntityManagerFactory") public LocalContainerEntityManagerFactoryBean pgEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("pgDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.entity.pg") .persistenceUnit("pg") .properties(pgJpaProperties()) .build(); } @Bean(name = "pgTransactionManager") public PlatformTransactionManager pgTransactionManager( @Qualifier("pgEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } private Map<String, Object> pgJpaProperties() { HashMap<String, Object> props = new HashMap<>(); props.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); return props; } } ``` ### 四、关键配置说明 1. **@Primary注解**:标记主数据源配置 2. **basePackages分离**: - MySQL实体放在`com.example.entity.mysql` - PostgreSQL实体放在`com.example.entity.pg` 3. **仓库路径分离**: - MySQL仓库接口放在`com.example.repository.mysql` - PostgreSQL仓库接口放在`com.example.repository.pg` 4. **事务管理器隔离**:确保每个数据源使用独立的事务管理器 ### 五、使用示例 ```java @Service public class DualService { // MySQL操作 @Transactional("mysqlTransactionManager") public void mysqlOperation() { // 使用MySQL仓库操作 } // PostgreSQL操作 @Transactional("pgTransactionManager") public void pgOperation() { // 使用PostgreSQL仓库操作 } } ``` ### 六、常见问题排查 1. **驱动类加载失败**:检查`driver-class-name`是否正确 2. **URL格式错误**: - MySQL需要时区参数 - PostgreSQL端口默认5432 3. **事务不生效**:确保@Transactional注解指定了正确的事务管理器 4. **实体扫描冲突**:严格分离不同数据源的实体类路径 > 建议在配置完成后,通过编写单元测试分别验证两个数据源的连接和操作是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值