如何配置多个数据源在SpringBoot项目中?

参考回答

在 Spring Boot 项目中配置多个数据源时,需要以下几个步骤:

  1. 定义数据源配置类:为每个数据源创建独立的配置类。
  2. 配置 DataSource:在每个配置类中配置不同的 DataSource
  3. 创建 JdbcTemplateEntityManagerFactory:为每个数据源配置相应的 JdbcTemplateEntityManagerFactory
  4. 配置事务管理器:为每个数据源配置事务管理器,以保证事务的正确处理。

详细讲解与拓展

1. 添加依赖

首先,确保你的 pom.xml 中已经添加了 Spring Boot 和数据库相关的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- 选择适合的数据库驱动 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 其他数据库驱动依赖 -->
</dependencies>
XML

2. 配置数据源

我们将配置两个数据源,primaryDataSourcesecondaryDataSource,分别用于主数据库和辅助数据库。

主数据源配置类(PrimaryDataSourceConfig)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = "com.example.repository.primary", // 指定主数据源的 Repository 路径
    entityManagerFactoryRef = "primaryEntityManagerFactory",
    transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {

    @Primary // 标记为主数据源
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary") // 从配置文件中加载配置
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.model.primary") // 指定实体类路径
                .persistenceUnit("primary")
                .build();
    }

    @Primary
    @Bean(name = "primaryTransactionManager")
    public PlatformTransactionManager primaryTransactionManager(
            @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
Java
辅助数据源配置类(SecondaryDataSourceConfig)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = "com.example.repository.secondary", // 指定辅助数据源的 Repository 路径
    entityManagerFactoryRef = "secondaryEntityManagerFactory",
    transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary") // 从配置文件中加载配置
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.model.secondary") // 指定实体类路径
                .persistenceUnit("secondary")
                .build();
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(
            @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
Java

3. 配置数据源属性

application.propertiesapplication.yml 中为每个数据源配置连接信息。

application.properties 示例
# 主数据源配置
spring.datasource.primary.url=jdbc:h2:mem:testdb
spring.datasource.primary.driverClassName=org.h2.Driver
spring.datasource.primary.username=sa
spring.datasource.primary.password=password
spring.datasource.primary.jpa.hibernate.ddl-auto=update

# 辅助数据源配置
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.jpa.hibernate.ddl-auto=update
.properties

4. 配置 JdbcTemplate(可选)

如果需要使用 JdbcTemplate 进行操作,可以为每个数据源配置不同的 JdbcTemplate

@Configuration
public class JdbcTemplateConfig {

    @Primary
    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
Java

5. 创建 Repository

为每个数据源创建不同的 Repository,并在 @EnableJpaRepositories 中指定不同的包路径。

@EnableJpaRepositories(
    basePackages = "com.example.repository.primary",
    entityManagerFactoryRef = "primaryEntityManagerFactory",
    transactionManagerRef = "primaryTransactionManager"
)
public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> {
}

@EnableJpaRepositories(
    basePackages = "com.example.repository.secondary",
    entityManagerFactoryRef = "secondaryEntityManagerFactory",
    transactionManagerRef = "secondaryTransactionManager"
)
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {
}
Java

总结

配置多个数据源时,关键是通过为每个数据源创建独立的配置类,并在配置类中为每个数据源配置 DataSourceEntityManagerFactoryTransactionManager。在 application.properties 中配置不同的数据源属性,并通过 @EnableJpaRepositories 指定每个数据源对应的 Repository。这样可以实现在同一个 Spring Boot 应用中使用多个数据源,从而支持多数据库操作。

发表评论

后才能评论