Spring Boot配置多数据源

热血战士喵 2024-05-17 ⋅ 28 阅读

在某些场景下,我们需要在一个应用程序中使用多个数据库。Spring Boot 提供了简单而灵活的方式来配置多个数据源。

步骤

1. 添加相关依赖

首先,我们需要在 pom.xml 文件中添加以下依赖:

<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    ...
</dependencies>

2. 配置数据源

application.properties (或 application.yml)文件中配置数据源。

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

## 第二个数据源
datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
datasource.secondary.username=root
datasource.secondary.password=password
datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

3. 创建数据源配置类

创建一个用于配置数据源的类,例如 DataSourceConfig.java

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

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

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

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder,
                                                                            @Qualifier("mainDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.maindb.entities")
                .build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder,
                                                                               @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.secondarydb.entities")
                .build();
    }

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

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

}

4. 使用多数据源

在需要使用数据源的地方,使用 @Qualifier 注解来指定使用哪个数据源。

@Service
public class MyService {

    @Autowired
    @Qualifier("mainEntityManagerFactory")
    private EntityManagerFactory mainEntityManagerFactory;

    @Autowired
    @Qualifier("secondaryEntityManagerFactory")
    private EntityManagerFactory secondaryEntityManagerFactory;

    // 使用主数据源
    public void doSomethingWithMainDataSource() {
        EntityManager entityManager = mainEntityManagerFactory.createEntityManager();
        // ...
    }

    // 使用第二个数据源
    public void doSomethingWithSecondaryDataSource() {
        EntityManager entityManager = secondaryEntityManagerFactory.createEntityManager();
        // ...
    }

}

总结

配置多数据源是在一个应用程序中使用多个数据库的常见需求。使用 Spring Boot 可以很容易地配置多个数据源,并且使用 @Qualifier 注解来指定具体使用哪个数据源。这种灵活性和简单性是 Spring Boot 的优势之一。

希望这篇博客对你有所帮助。如果你有任何问题或建议,欢迎留言讨论!


全部评论: 0

    我有话说: