在 Spring Boot 中实现多数据源的配置和管理涉及到一些核心概念和步骤。以下是一个基本的多数据源配置示例,涉及到了主数据源和辅助数据源的配置。

1. 添加依赖:

首先,确保你的项目中添加了连接数据库的相关依赖,例如 MySQL 或其他数据库的 JDBC 驱动。

2. 配置数据源:

application.propertiesapplication.yml 文件中配置主数据源和辅助数据源的连接信息:

# 主数据源配置
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primarydb
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 辅助数据源配置
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

3. 配置数据源 Bean:

创建两个不同的数据源 Bean,一个用于主数据源,另一个用于辅助数据源。同时,配置 JPA 的 EntityManagerFactory 和事务管理器。

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource dataSourceSecondary() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.domain.primary") // 设置主数据源实体类所在的包
                .persistenceUnit("primary")
                .build();
    }

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.domain.secondary") // 设置辅助数据源实体类所在的包
                .persistenceUnit("secondary")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Bean(name = "transactionManagerSecondary")
    public PlatformTransactionManager transactionManagerSecondary(@Qualifier("entityManagerFactorySecondary") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

4. 配置 Repository:

在实体类对应的包中创建两个不同的 Repository 接口,分别用于主数据源和辅助数据源。

// 主数据源 Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // Custom queries for primary data source
}

// 辅助数据源 Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    // Custom queries for secondary data source
}

5. 使用不同的数据源:

在服务类或控制器中使用 @Qualifier 注解指定要使用的数据源:

@Service
public class MyService {

    @Autowired
    @Qualifier("userRepository")
    private UserRepository userRepository;

    @Autowired
    @Qualifier("productRepository")
    private ProductRepository productRepository;

    // Service methods
}

以上是一个基本的多数据源配置示例,实际应用中可能会有更复杂的需求,例如事务管理、多数据源切换策略等,这时需要根据具体情况进行更详细的配置和处理。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.