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和配置类被正确注解,测试应用是否能够启动,数据源是否能够正确读写数据。

相关推荐
知其然亦知其所以然10 分钟前
SpringAI + Groq 实战:3 分钟教你搭建超快聊天机器人!
java·后端·openai
M1A122 分钟前
诺贝尔奖得主的终极学习法:西蒙学习法全解读
后端
阿波罗尼亚24 分钟前
ExcelUtils实现 设置内容 插入行 复制行列格式
java·开发语言
Monkey-旭31 分钟前
Android 定位技术全解析:从基础实现到精准优化
android·java·kotlin·地图·定位
带刺的坐椅32 分钟前
Solon StateMachine 实现状态机使用示例详解
java·solon·状态机
Yyyy4821 小时前
MyCAT高可用
java·运维
PetterHillWater1 小时前
基于AI互联网系统架构分析与评估
后端·aigc
MaxHua1 小时前
多数据源与分库分表方案设计
后端·面试
季风11321 小时前
17.Axon框架-消息
后端·领域驱动设计
苏三说技术1 小时前
Token续期的5种方案
后端