Spring Boot配置多数据源

1. 简介

在实际开发中,我们经常需要在一个应用中使用多个数据源,比如同时连接多个数据库。Spring Boot提供了简单而强大的机制来配置和管理多个数据源。

本文将向刚入行的小白介绍如何在Spring Boot中配置多数据源,并提供每一步的具体代码示例。

2. 流程概览

下面的表格展示了配置多数据源的整个流程:

步骤 描述
1 添加多数据源配置
2 创建数据源
3 创建JdbcTemplate
4 创建实体类和Repository
5 配置事务管理器
6 配置数据源切换
7 使用多数据源

接下来,我们将详细介绍每一步的具体操作。

3. 添加多数据源配置

首先,我们需要在application.properties中添加多数据源的配置:

# 数据源1
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=root
spring.datasource.password=passw0rd

# 数据源2
spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.db2.username=root
spring.datasource.db2.password=passw0rd

这样我们就定义了两个数据源,分别对应了db1db2两个数据库。

4. 创建数据源

接下来,我们需要创建数据源。

@Configuration
public class DataSourceConfig {

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

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

在上述代码中,dataSource()方法创建了主数据源,db2DataSource()方法创建了第二个数据源。注意,我们使用了@ConfigurationProperties注解来读取application.properties中的配置。

5. 创建JdbcTemplate

接下来,我们需要为每个数据源创建一个JdbcTemplate实例。

@Configuration
public class JdbcTemplateConfig {

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

    @Bean(name = "db2JdbcTemplate")
    public JdbcTemplate db2JdbcTemplate(@Qualifier("db2DataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

在上述代码中,我们使用@Qualifier注解来指定每个JdbcTemplate对应的数据源。

6. 创建实体类和Repository

现在,我们需要创建实体类和Repository来访问数据库。

@Entity
@Table(name = "user")
public class User {
    // 实体类代码...
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // Repository代码...
}

在上述代码中,User是一个简单的实体类,UserRepository是一个继承自JpaRepository的接口。

7. 配置事务管理器

在多数据源的情况下,我们需要配置多个事务管理器。

@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {

    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;

    @Autowired
    @Qualifier("db2DataSource")
    private DataSource db2DataSource;

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "db2TransactionManager")
    public PlatformTransactionManager db2TransactionManager() {
        return new DataSourceTransactionManager(db2DataSource);
    }
}

在上述代码中,我们使用@Qualifier注解指定了每个事务管理器对应的数据源。

8. 配置数据源切换

为了在不同的数据源之间切换,我们需要创建一个DataSourceContextHolder来保存当前使用的数据源。

public class DataSourceContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
    }

    public static String getDataSource() {
        return contextHolder.get();
    }

    public static void clearDataSource() {
        contextHolder.remove();
    }
}

9. 使用多数据源

最后,我们可以在需要