Spring Boot 如何支持多数据源

大家好,我是伍六七。一个专注于输出 AI+ 编程内容的在职大厂资深程序员,全国最大 AI 付费社群破局初创合伙人,关注我一起破除 35 岁危机。

一、引言

在现代企业级应用中,处理多个数据库是一项常见且关键的需求。

Spring Boot 作为一个高效、灵活的框架,提供了优雅的支持多数据源的解决方案。本文将详细介绍如何在 Spring Boot 项目中配置和使用多个数据源,以及使用 MySQL 作为示例数据库的相关配置。

二、多数据源的概念及重要性

多数据源指的是在一个应用中同时连接和操作多个数据库。

Spring Boot 中,这通常意味着配置多个 DataSource 对象。使用多数据源的优势包括:

  • 数据隔离:不同业务模块可以使用不同的数据库,降低耦合度。
  • 性能优化:根据业务需求分散数据库负载。
  • 灵活性:可以同时使用不同类型的数据库。

三、在 Spring Boot 中配置多数据源

1. 引入依赖

首先,确保在 pom.xml 中引入了 Spring Boot Data JPAMySQL 的依赖。

xml 复制代码
<dependencies>
    <!-- Spring Boot Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

2. 配置数据源

application.propertiesapplication.yml 中,配置两个数据源。

yaml 复制代码
# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db
spring.datasource.primary.username=root
spring.datasource.primary.password=root

# 辅助数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root

3. 创建 DataSource 配置类

创建两个数据源的配置类,分别对应两个数据源。

java 复制代码
@Configuration
public class DataSource1Config {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

@Configuration
public class DataSource2Config {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

DataSource1ConfigDataSource2Config 分别配置了两个数据源,并使用 @ConfigurationProperties 注解将配置文件中的属性绑定到 DataSource 对象上。

这样,两个不同数据源就有不同的 JdbcTemplate,一个叫 jdbcTemplate,另一个叫 secondJdbcTemplate,也就是返回 JdbcTemplate 的两个方法名。

四、在代码中使用多数据源

在需要使用 DB 操作的地方,可以在需要使用数据源的地方注入对应的 JdbcTemplate 对象,并使用它来执行数据库操作。

java 复制代码
@Service
public class MyService {

    private final JdbcTemplate jdbcTemplate;
    private final JdbcTemplate secondJdbcTemplate;

    public MyService(JdbcTemplate jdbcTemplate, JdbcTemplate secondJdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        this.secondJdbcTemplate = secondJdbcTemplate;
    }

    public void doSomething() {
        // 使用第一个数据源执行操作
        jdbcTemplate.execute("INSERT INTO table1 (column1) VALUES ('value1')");

        // 使用第二个数据源执行操作
        secondJdbcTemplate.execute("INSERT INTO table2 (column2) VALUES ('value2')");
    }
}

五、设置连接池参数

在实际公司场景中,代码的边界是很重要的,连接数据库的边界除了数据操作权限,还是连接数据库的连接数,如果超了上限,很容易引起数据库崩溃,影响其他应用。

yaml 文件配置修改

yaml 复制代码
# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.max-active=10
spring.datasource.primary.driver-class-name=org.postgresql.Driver

我们可以通过修改 DataSource 具体实现类,限制最大连接数。修改后的 DataSource1Config 类。

java 复制代码
@Configuration
public class DataSource1Config {
    @Value("${spring.datasource.primary.username}")
    private String username;
    @Value("${spring.datasource.primary.password}")
    private String password;
    @Value("${spring.datasource.primary.url}")
    private String url;
    @Value("${spring.datasource.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.primary.max-active}")
    private int maxActive;

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource dataSource() {
        BasicDataSource basicDataSource = new BasicDataSource();
        basicDataSource.setUrl(url);
        basicDataSource.setUsername(username);
        basicDataSource.setPassword(password);
        basicDataSource.setDriverClassName(driver);
        basicDataSource.setMaxTotal(maxActive);
        return basicDataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

这样,我们就限制了代码连接 DB 的最大连接数,保护了 DB!

六、结语

Spring Boot 中配置和使用多数据源虽然复杂,但为应用带来了极大的灵活性和扩展性。

通过上述步骤,你可以轻松地在你的 Spring Boot 应用中配置和使用多个数据源。

但是要记得在实际部署时根据业务需求和服务器配置调整数据库连接设置,以优化应用性能。

< END >

对了,阿七新开了一个免费知识星球,欢迎大家点击链接加入,在星球,你能获得:

  1. 免费编程技术提问
  2. AI 编程分享
  3. 副业探索&IP认知
  4. 面试交流区
  5. 职场内推 & 找合作
  6. 围观作者一起搞技术自媒体
  7. 提高自己的认知
  8. 围观我的成长
  9. 链接大佬

链接我,领免费面试资料

相关推荐
欧恩意4 小时前
【Tools】Java反汇编工具推荐
java·汇编
苍何4 小时前
字节发力,豆包大模型2.0 震撼来袭(附 Trae 实测)
后端
苍何5 小时前
不会剪辑的人,开始用 AI 批量出爆款了
后端
苍何5 小时前
百度 APP 正式接入 OpenClaw,所有人限时免费!
后端
寻星探路5 小时前
【JVM 终极通关指南】万字长文从底层到实战全维度深度拆解 Java 虚拟机
java·开发语言·jvm·人工智能·python·算法·ai
lbb 小魔仙5 小时前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
星河耀银海5 小时前
Java安全开发实战:从代码防护到架构安全
java·安全·架构
青云交5 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市水资源管理与节水策略制定中的应用
java·java 大数据·java 大数据可视化·城市水资源管理·spark 数据清洗·echarts 热力图·管网漏损控制
紫陌涵光5 小时前
112. 路径总和
java·前端·算法
workflower5 小时前
多变量时间序列预测
java·hadoop·nosql·需求分析·big data·结对编程