Spring Boot应用中集成与使用多数据源

Spring Boot应用中集成与使用多数据源

1. 前言

通过定义和使用多个数据源,能在Spring Boot应用中实现更复杂的数据管理场景,比如读写分离、数据冗余等。

2. 准备工作
  • 环境准备:确保已经准备好Spring Boot的开发环境。
  • 数据库准备:在本地或云服务上创建两个数据库,如下文所示。

3. 创建Spring Boot项目
  1. 使用Spring Initializr创建项目:https://start.spring.io/。
  2. pom.xml中添加必要的依赖,包括JPA、Spring Boot Parent、数据库驱动等。

4. 配置多数据源

application.ymlapplication.properties中配置:

yaml 复制代码
# application.yml
spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/db1
      username: user
      password: password
      driver-class-name: com.mysql.jdbc.Driver
      hikari:
        connection-timeout: 30000
        maximum-pool-size: 20

    secondary:
      url: jdbc:mysql://localhost:3306/db2
      username: user
      password: password
      driver-class-name: com.mysql.jdbc.Driver
      hikari:
        connection-timeout: 30000
        maximum-pool-size: 20

5. 创建实体类及Repository

Entity Class - User (For Primary Database):

java 复制代码
package com.example.multidatasource.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
    private String name;
    private String email;

    // getter, setter, constructors
}

Entity Class - Product (For Secondary Database):

java 复制代码
package com.example.multidatasource.entity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "products")
public class Product {
    @Id
    private Long id;
    private String name;
    private int price;

    // getter, setter, constructors
}

Repository (Primary):

java 复制代码
package com.example.multidatasource.repository;

import com.example.multidatasource.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

Repository (Secondary):

java 复制代码
package com.example.multidatasource.repository;

import com.example.multidatasource.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
6. 服务层配置与使用多数据源
java 复制代码
package com.example.multidatasource.service;

import com.example.multidatasource.entity.Product;
import com.example.multidatasource.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Product createProduct(String name, int price) {
        Product product = new Product();
        product.setName(name);
        product.setPrice(price);
        return productRepository.save(product);
    }
}

服务层同样应当遵循具体数据源的配置,确保通过合适的数据源进行持久化操作。

7. 事务与多数据源管理

针对跨数据源的事务操作,需要在@Service中配置@Transactional注解:

java 复制代码
@Service
public class MultiDataSourceTransactionService {

    private final UserRepository userRepository;
    private final ProductRepository productRepository;

    @Autowired
    public MultiDataSourceTransactionService(UserRepository userRepository, ProductRepository productRepository) {
        this.userRepository = userRepository;
        this.productRepository = productRepository;
    }

    // So that it's only using the primary dataSource
    @Transactional(propagation = Propagation.REQUIRED)
    public void performCreateUserAndProduct() {
        userRepository.save(new User("John Doe", "john@example.com"));
        productRepository.save(new Product("Widget", 1000));
    }
}

通过这种方式,可以确保同一个请求中的所有操作,要么全部成功,要么全部回滚。

8. 配置及测试

确保所有的Bean和配置类被正确注解,测试应用是否能够启动,数据源是否能够正确读写数据。

相关推荐
杨运交12 分钟前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
亦暖筑序14 分钟前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
血小溅15 分钟前
飞书 CLI 集成基础教程
后端
ihgry26 分钟前
SpringBoot+Redis限流
后端
晚安code28 分钟前
Nacos 注解全解析:7 个核心注解 + 5 个生产踩坑清单(2026 实测)
后端
wei_shuo29 分钟前
KES 备份恢复与数据灾备实战:物理备份、逻辑备份与PITR完全指南
后端
Ai拆代码的曹操30 分钟前
Netty 堆外内存泄漏从 0 到 1 排查实录:RES 1.2G 堆只有 256M
后端
敲代码的彭于晏1 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
IT_陈寒1 小时前
Redis内存飙升的锅,原来是我没搞懂这个过期策略
前端·人工智能·后端
铁皮饭盒2 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端