实现 Java 项目中的多数据源配置

在实际开发中,处理多数据源的场景逐渐变得普遍。特别是在微服务架构或复杂业务场景中,合理运用多数据源能有效提高系统性能和灵活性。本文将带你一步步了解如何在 Java 项目中配置和使用多个数据源。

流程介绍

我们将通过以下步骤来实现项目中多数据源的配置:

阶段 描述
步骤 1 添加依赖
步骤 2 配置数据源
步骤 3 创建数据源配置类
步骤 4 配置实体类与仓储接口
步骤 5 创建服务与控制层
步骤 6 测试多数据源是否正常工作

接下来,我们将逐步讲解这几个阶段。

步骤 1: 添加依赖

在你的 pom.xml 中添加如下依赖,以支持 Spring Data JPA 和多数据源配置。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

注释:

  • spring-boot-starter-data-jpa : 用于支持 Spring Data JPA。
  • h2 : 嵌入式数据库,适合开发和测试使用。
  • spring-boot-starter : Spring Boot 的基础配置信息。

步骤 2: 配置数据源

application.propertiesapplication.yml 文件中配置多个数据源。

# 数据源1配置
spring.datasource.primary.url=jdbc:h2:mem:primarydb
spring.datasource.primary.username=sa
spring.datasource.primary.password=password
spring.datasource.primary.driver-class-name=org.h2.Driver

# 数据源2配置
spring.datasource.secondary.url=jdbc:h2:mem:secondarydb
spring.datasource.secondary.username=sa
spring.datasource.secondary.password=password
spring.datasource.secondary.driver-class-name=org.h2.Driver

注释:

  • 这里我们使用了 H2 数据库。可以依据实际需求更换为其他数据库,并调整连接字符串。

步骤 3: 创建数据源配置类

我们需要创建两个配置类,用来分别管理二个数据源。

@Configuration
@EnableTransactionManagement
public class PrimaryDataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder,
        @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.primary") // 实体类路径
                .persistenceUnit("primary")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager primaryTransactionManager(
        @Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) {
        return new JpaTransactionManager(primaryEntityManagerFactory);
    }
}

注释:

  • @Primary 注解用于标识主数据源。
  • DataSourceBuilder.create().build() 用于构建数据源。
  • EntityManagerFactory 用于配置 JPA 的实体管理器。

同理,我们为第二个数据源创建类似配置类:

@Configuration
public class SecondaryDataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder,
        @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.secondary") // 实体类路径
                .persistenceUnit("secondary")
                .build();
    }

    @Bean
    public PlatformTransactionManager secondaryTransactionManager(
        @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) {
        return new JpaTransactionManager(secondaryEntityManagerFactory);
    }
}

步骤 4: 配置实体类与仓储接口

示例实体类可能如下所示:

@Entity
@Table(name = "primary_table")
public class PrimaryEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String data;
    // getters and setters
}
@Entity
@Table(name = "secondary_table")
public class SecondaryEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String info;
    // getters and setters
}

仓储接口:

public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> {
}

public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {
}

步骤 5: 创建服务与控制层

借助 Spring 的依赖注入机制实现服务和控制层.

@Service
public class PrimaryService {
    @Autowired
    private PrimaryRepository primaryRepository;

    public PrimaryEntity savePrimary(PrimaryEntity entity) {
        return primaryRepository.save(entity);
    }
}

控制层代码可能如下:

@RestController
@RequestMapping("/primary")
public class PrimaryController {
    @Autowired
    private PrimaryService primaryService;

    @PostMapping
    public ResponseEntity<PrimaryEntity> createPrimary(@RequestBody PrimaryEntity entity) {
        return new ResponseEntity<>(primaryService.savePrimary(entity), HttpStatus.CREATED);
    }
}

步骤 6: 测试多数据源是否正常工作

最后,我们通过 Postman 或其他工具向 /primary 接口发送请求进行测试,确保两个数据源都能正常工作。

旅行图: 多数据源配置流程

journey
    title 多数据源配置流程
    section 步骤 1
      添加依赖: 5:  需要支持 JPA 和数据库
    section 步骤 2
      配置数据源: 5:  设定数据库连接信息
    section 步骤 3
      创建数据源配置类: 5:  管理数据源与事务
    section 步骤 4
      配置实体类与仓储接口: 5:  数据存储的基础结构
    section 步骤 5 
      创建服务与控制层: 5:  封装业务逻辑
    section 步骤 6
      测试: 5:  确保所有功能正常

流程图: 多数据源配置过程

flowchart TD
    A[开始配置多数据源] --> B[添加依赖]
    B --> C[配置数据源]
    C --> D[创建数据源配置类]
    D --> E[配置实体类与仓储接口]
    E --> F[创建服务与控制层]
    F --> G[测试多数据源]
    G --> H[完成]

结尾

通过上述步骤,我们成功配置了一个简单的 Java 项目多数据源功能实现。在复杂的业务场景中,这种模式能够有效提高业务的独立性和可维护性。希望这篇文章能够帮助你更好地理解和实现 Java 中的多数据源操作!如有任何疑问和需求,请随时交流。在接下来的学习中,深入探索 Spring 的更多特性,你将发现更大的世界。