如何在 Spring Boot 微服务中设置和管理多个数据库

server/2024/12/29 9:42:15/

在现代微服务架构中,通常需要与多个数据库交互的服务。这可能是由于各种原因,例如遗留系统集成、不同类型的数据存储需求,或者仅仅是为了优化性能。Spring Boot 具有灵活的配置和强大的数据访问库,可以轻松配置多个数据库。在本综合指南中,我们将探讨如何在 Spring Boot 微服务中设置和管理多个数据库连接。

1. 简介

微服务通常需要与各种数据库交互。每个微服务可能需要不同类型的数据库,例如用于事务数据的 SQL 数据库和用于非结构化数据的 NoSQL 数据库。Spring Boot 为配置和管理多个数据源提供了出色的支持,使其成为现代微服务架构的理想选择。

2.为什么要使用多个数据库

您可能需要在微服务中使用多个数据库的原因如下:

  • 遗留系统集成:与遗留系统的现有数据库集成。
  • 优化性能:使用针对特定类型的数据(例如关系型与非关系型)优化的不同数据库
  • 数据隔离:出于安全、合规或组织原因分离数据。
  • 可扩展性:在不同的数据库之间分配数据负载以提高性能。

3.设置 Spring Boot 项目

首先,创建一个新的 Spring Boot 项目。您可以使用 Spring Initializr 或您喜欢的 IDE 来设置项目。

Maven 依赖项

在您的 中pom.xml包含 Spring Data JPA 和您将使用的数据库的依赖项(例如,内存中的 H2、PostgreSQL、MySQL 等)。

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

4.配置多个数据源

application.ymlapplication.properties文件中,配置每个数据库的连接属性。

application.yml

spring:datasource:primary:url: jdbc:h2:mem:primarydbdriver-class-name: org.h2.Driverusername: sapassword: passwordsecondary:url: jdbc:postgresql://localhost:5432/secondarydbdriver-class-name: org.postgresql.Driverusername: postgrespassword: password
jpa:primary:database-platform: org.hibernate.dialect.H2Dialecthibernate:ddl-auto: updatesecondary:database-platform: org.hibernate.dialect.PostgreSQLDialecthibernate:ddl-auto: update

5.创建数据源配置类

接下来,为每个数据源创建单独的配置类。

主数据源配置

java">package com.example.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories(basePackages = "com.example.primary.repository",entityManagerFactoryRef = "primaryEntityManagerFactory",transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "primaryEntityManagerFactory")public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(@Qualifier("primaryDataSource") DataSource dataSource) {LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();em.setDataSource(dataSource);em.setPackagesToScan(new String[] { "com.example.primary.entity" });HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();em.setJpaVendorAdapter(vendorAdapter);return em;}@Bean(name = "primaryTransactionManager")public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}
}

辅助数据源配置

java">package com.example.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories(basePackages = "com.example.secondary.repository",entityManagerFactoryRef = "secondaryEntityManagerFactory",transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryEntityManagerFactory")public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(@Qualifier("secondaryDataSource") DataSource dataSource) {LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();em.setDataSource(dataSource);em.setPackagesToScan(new String[] { "com.example.secondary.entity" });HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();em.setJpaVendorAdapter(vendorAdapter);return em;}@Bean(name = "secondaryTransactionManager")public PlatformTransactionManager secondaryTransactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}
}

6. 定义实体管理器

为每个数据库定义实体类。确保将它们放在配置类中指定的相应包中。

数据库实体

java">package com.example.primary.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class PrimaryEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// getters and setters
}

辅助数据库实体

java">package com.example.secondary.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class SecondaryEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String description;// getters and setters
}

7. 创建存储库

为每个数据库创建存储库接口,确保它们按照配置放置在正确的包中。

主存储库

java">package com.example.primary.repository;
import com.example.secondary.entity.SecondaryEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {
}

二级存储库

java">package com.example.secondary.repository;
import com.example.secondary.entity.SecondaryEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {
}

8.测试配置

最后,创建一个简单的 REST 控制器来测试设置。此控制器将使用两个存储库来执行 CRUD 操作。

java">package com.example.controller;
import com.example.primary.entity.PrimaryEntity;
import com.example.primary.repository.PrimaryRepository;
import com.example.secondary.entity.SecondaryEntity;
import com.example.secondary.repository.SecondaryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {@Autowiredprivate PrimaryRepository primaryRepository;@Autowiredprivate SecondaryRepository secondaryRepository;@GetMapping("/test")public String test() {PrimaryEntity primaryEntity = new PrimaryEntity();primaryEntity.setName("Primary Entity");primaryRepository.save(primaryEntity);SecondaryEntity secondaryEntity = new SecondaryEntity();secondaryEntity.setDescription("Secondary Entity");secondaryRepository.save(secondaryEntity);return "Entities saved!";}
}


http://www.ppmy.cn/server/154162.html

相关文章

Linux top指令

top指令概述 top 是 Linux 系统中用于实时监控系统性能和进程信息的命令&#xff0c;功能强大且灵活。它提供了系统资源的动态视图&#xff0c;包括 CPU、内存、运行中的进程等。 这个指令可以说是Linux中最基本的工具了&#xff0c;用来监视系统的实时运行状态&#xff0c;类…

算法

探索算法世界&#xff1a;从基础到前沿 一、引言 算法是计算机科学的核心&#xff0c;它为解决各种问题提供了明确的步骤和方法。无论是数据处理、人工智能还是日常软件应用&#xff0c;算法都起着关键作用。 二、基础算法 排序算法 排序算法是最常见的算法之一。例如冒泡排序&…

Rtsplive-视频流-Linux部署

系统环境&#xff1a;Ubuntu-24.04-server JDK环境&#xff1a;≥java17 一、部署rtsplive 上传rtsplive-ubuntu-x64.tar.gz至linux-Ubuntu-24.04服务器 并解压至/opt目录下 二、安装JDK 使用Java 命令&#xff0c;检测是否有安装java&#xff0c;是否大于17版本 如系统安…

遗传算法——附python实现与各方法的作用与修改

前言 遗传算法是数学建模中非常重要的一种搜索和优化算法&#xff0c;掌握遗传算法的精髓除了在竞赛中具有优势以外&#xff0c;更主要的是在解决实际问题的时候提供了一种全新的思路&#xff0c;通过将现实中的某种模式转换成算法&#xff0c;并用以解决某种问题的这种思路&a…

info There appears to be trouble with your network connection. Retrying

这个错误信息表明你在使用包管理器安装项目依赖时遇到了网络连接问题。 可能的解决方法&#xff1a; 检查当前node.js版本是否过低。 建议使用当前长期支持版本 yarn的淘宝镜像&#xff1a;yarn的淘宝镜像-CSDN博客 nvm常用命令:NVM常用命令-CSDN博客 下载 | Node.js 中文…

网络安全的学习路线

最近在绿盟公司实习&#xff0c;看了这篇博客&#xff0c;点击这里 &#xff0c;有所感悟&#xff0c;自己记录一下网络安全的学习路线。 网络安全主要分别以下几种&#xff1a;1 web安全 2 系统安全 3二进制逆向 4 红蓝对抗 5 密码学 6 AI安全 7 移动&#xff08;ios,Anr…

Python 输出华丽分割线的方式大全

在 Python 编程中&#xff0c;有时候我们需要为日志、输出结果或者调试信息添加一些分割线&#xff0c;方便视觉上的区分。这篇文章将介绍几种常见的方法和一些创意的分割线设计&#xff0c;帮助你让代码输出更具美感和个性化。 方法 1: 基础分割线 使用 print() 和简单的字符…

SQL 实战:MySQL JSON 函数解析 – 处理非结构化数据

在现代应用中&#xff0c;非结构化数据如 JSON 格式广泛应用于存储复杂的配置信息、动态表单以及嵌套数据。MySQL 从 5.7 版本起正式支持 JSON 数据类型&#xff0c;允许开发者直接在数据库中存储和查询 JSON 格式的数据。 本文将介绍如何使用 MySQL 的 JSON 函数 处理复杂的嵌…