Spring Boot与MySQL的多数据库连接

Spring Boot是一个用于简化Java开发的框架,尤其是在构建Web应用和RESTful服务时非常受欢迎。在实际开发中,我们可能会需要连接多个数据库,尤其是在微服务架构中。本文将介绍如何在Spring Boot中实现与MySQL的多库连接,并提供代码示例。

1. 项目依赖

首先,我们需要在pom.xml中加入Spring Boot和MySQL相关的依赖。以下是相关配置:

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

2. 配置多数据源

接下来,我们需要在application.yml中配置多个数据源。例如,假设我们有两个MySQL数据库,分别是db1db2

spring:
  datasource:
    db1:
      url: jdbc:mysql://localhost:3306/db1
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    db2:
      url: jdbc:mysql://localhost:3306/db2
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

3. 创建数据源配置类

我们需要为每个数据源创建一个配置类,以便于Spring Boot能够正确地识别它们:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.EntityManagerFactory;

@Configuration
public class DataSourceConfig {

    @Primary
    @Bean(name = "db1Properties")
    @ConfigurationProperties("spring.datasource.db1")
    public DataSourceProperties db1Properties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "db1DataSource")
    public DataSource db1DataSource() {
        return db1Properties().initializeDataSourceBuilder().build();
    }

    @Primary
    @Bean(name = "db1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(
            @Qualifier("db1DataSource") DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan("com.example.db1.model");
        return em;
    }

    @Primary
    @Bean(name = "db1TransactionManager")
    public PlatformTransactionManager db1TransactionManager(
            @Qualifier("db1EntityManagerFactory") EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }

    // 类似地配置 db2
}

4. 流程图

下面是一个关于流程的简易流程图,展示了如何处理多个数据源。

flowchart TD
    A[启动Spring Boot应用] --> B{选择数据源}
    B -- db1 --> C[使用db1进行操作]
    B -- db2 --> D[使用db2进行操作]
    C --> E[处理结果]
    D --> E
    E --> F[返回响应]

5. 使用示例

最后,我们可以通过以下示例代码来使用配置的多数据源:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MultiDBService {

    @Autowired
    private UserRepository1 userRepository1; // db1的仓库

    @Autowired
    private UserRepository2 userRepository2; // db2的仓库

    @Transactional("db1TransactionManager")
    public void performDb1Operation() {
        // 与db1进行的操作
    }

    @Transactional("db2TransactionManager")
    public void performDb2Operation() {
        // 与db2进行的操作
    }
}

总结

在本文中,我们介绍了如何在Spring Boot中配置和使用多个MySQL数据库。通过定义多个数据源、各自的配置类以及操作服务,我们可以灵活地对多个数据库进行操作。这种灵活的数据库管理也为微服务架构提供了支持,能够适应不断变化的业务需求。希望通过这篇文章,您能更好地理解Spring Boot与多库连接的实现。