SpringDataJPA配置多套数据源

场景

在使用Spring Data JPA的服务中, 需要同时连接自己的数据库进行增删改查, 也需要连接一个外部提供的数据库查询数据. 因此需要维护两套数据库配置.

实现思路

首先使用JPA一般都需要domain实体和repository. 规划为:

  • 主数据库的实体都放到统一包domain下, repository放repository
  • 第二套数据库的实体都放到统一包share.domain下, repository放share.repository

然后通过配置两套持久化单元,并分别指定扫描的包,完成两套数据库配置. 然后就可以通过调用repository分别实现对两套数据库的调用了.

主数据库的结构

./example/domain/User.java
./example/repository/UserRepository.java

第二套数据库结构

./example/share/domain/School.java
./example/share/repository/SchoolRepository.java

具体实现

1. 主数据库配置

主数据库配置

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;@Configuration
@EnableJpaAuditing
@EnableTransactionManagement
// 指定扫描的仓库目录
@EnableJpaRepositories(basePackages = {"example.repository"}, entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager")
public class DatabaseConfiguration {@Bean(name = "primaryDataSourceProperties")@ConfigurationProperties("spring.datasource")@Primarypublic DataSourceProperties dataSourceProperties() {return new DataSourceProperties();}@Primary@Bean(name = "dataSource")@ConfigurationProperties("spring.datasource.hikari")public HikariDataSource firstDataSource(DataSourceProperties firstDataSourceProperties) {return firstDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();}@Primary@Bean(name = "entityManagerFactory")public LocalContainerEntityManagerFactoryBeanentityManagerFactory(EntityManagerFactoryBuilder builder,DataSource dataSource) {return builder.dataSource(dataSource)// 指定扫描包.packages("example.domain").persistenceUnit("primary-domain").build();}@Primary@Bean(name = "transactionManager")public PlatformTransactionManager transactionManager(EntityManagerFactoryentityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}}

第二套数据库配置


import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
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.transaction.PlatformTransactionManager;import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;@Configuration
// 指定包扫描目录
@EnableJpaRepositories(basePackages = {"example.share.repository"}, entityManagerFactoryRef = "shareEntityManagerFactory", transactionManagerRef = "shareTransactionManager")
public class DatabaseShareConfiguration {@Bean(name = "shareDataSourceProperties")// 指定数据库配置前缀,然后可以通过 share.datasource.url 这种格式去配置第二套数据源配置@ConfigurationProperties("share.datasource")public DataSourceProperties dataSourceProperties() {return new DataSourceProperties();}@Bean(name = "shareDataSource")// 指定数据库配置前缀,然后可以通过 share.datasource.hikari.poolName 这种格式去配置第二套数据源配置@ConfigurationProperties("share.datasource.hikari")public DataSource dataSource(@Qualifier("shareDataSourceProperties") DataSourceProperties dataSourceProperties) {return dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();}@Bean(name = "shareEntityManagerFactory")public LocalContainerEntityManagerFactoryBeanshareEntityManagerFactory(EntityManagerFactoryBuilder builder,@Qualifier("shareDataSource") DataSource dataSource) {returnbuilder.dataSource(dataSource)// 指定扫描包地址.packages("example.share.domain").persistenceUnit("share").build();}@Bean(name = "shareTransactionManager")public PlatformTransactionManager shareTransactionManager(@Qualifier("shareEntityManagerFactory") EntityManagerFactoryshareEntityManagerFactory) {return new JpaTransactionManager(shareEntityManagerFactory);}
}

application.yml

# 主数据库配置
spring:datasource:type: com.zaxxer.hikari.HikariDataSourceusername: rooturl: jdbc:mysql://localhost:3306/password: hikari:poolName: Hikariauto-commit: false# 第二套数据库配置
share:datasource:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:mysql://localhost:3307/username: rootpassword:hikari:poolName: Share-Hikariauto-commit: false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738821.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot实现登录demo

springboot,Jwt认证,登录实现简单的登录功能 实体类 定义实体类为User3类。 使用@Data:提供类的get,set,equals,hashCode,canEqual,toString方法; 使用@AllArgsConstructor:提供类的全参构造 使用@NoArgsConstructor:提供类的无参构造 类代码如下 @Data @AllArgsCon…

csv 导出工具

csv 导出工具一般大数据量导出 都会选择 csv 格式,就是存文本格式,相比excel 轻量级,同样数据量 csv 文件更小。工具类,分页导出 /*** Author: lyc* Date: 2024/07/05 16:27*/ @Slf4j public class CsvUtils {/*** 大数量导出** @param fileName 生成文件地址* @para…

虚拟ECU:纯电动汽车发展下的新选择

​人类文明的进步是一个不断自我否定、自我超越的过程。21世纪以来,随着科技进步和经济社会发展,能源和交通系统已从独立于自然环境的孤立系统,转变为与自然、技术、社会深度耦合的复杂系统。为实现可持续发展和应对气候变化,世界各国都在积极推进能源结构调整和技术创新,…

Python多线程-线程池ThreadPoolExecutor

1. 线程池 不是线程数量越多,程序的执行效率就越快。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所以有时候开辟过多的线程不但不会提高程序的执行效率,反而会适得其反使程序变慢,得不偿失。 为…

一个用来画拉氏图的简单Python脚本

这里我提供了一个用于画拉氏图的Python脚本源代码,供大家免费使用。虽然现在也有很多免费的平台和工具可以用,但很多都是黑箱,有需要的开发者可以直接在这个脚本基础上二次开发,定制自己的拉氏图绘制方法。技术背景 关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述…

如何实现超大场景的三维模型(3D)轻量化

三维工厂K3DMaker是一款三维模型浏览、分析、轻量化、顶层合并构建、几何校正、格式转换、调色裁切等功能专业处理软件。可以进行三维模型的网格简化、纹理压缩、层级优化等操作,从而实现三维模型轻量化。轻量化压缩比大,模型轻量化效率高,自动化处理能力高;采用多种算法对…

HP惠普笔记本使用问题和开启TPM

HP电脑使用 开机按F10,进入BIOS,如果是英文,切换到 Advanced,选择 Display Language,选择 简体中文然后返回上一页,切换到 安全引导配置 选择“启用传统支持和禁用安全引导”,然后F10 保存退出 开机+ESC是进入主菜单,可以从这里选择,进入引导 HP电脑在桌面使用快捷键…

Mysql之基本操作(库,表,用户管理)

库中有表,表中有数据 一、查看帮助信息点击查看代码 mysql> help create //help 后面跟上具体命令可以查看帮助二、查看支持的字符集点击查看代码 show charset; //查看支持的字符集 默认拉丁文字 latin1utf8 | UTF-8 Unicode //阉割版的 utf8mb4 | UTF-8 Unicode …

海康SDK报错Structure.getFieldOrder()

就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了。比如 public static class NET_DVR_TIME extends Structure {//校时结构参数public int dwYear; //年public int dwMonth; //月public int dwDa…

数字证书的应用场景有哪些?

在当今数字化飞速发展的时代,数字证书作为保障信息安全和身份认证的重要工具,发挥着越来越关键的作用。那么,数字证书究竟在哪些场景中得到了广泛的应用呢? 一、电子商务领域 在电子商务交易中,数字证书确保了交易双方的身份真实性和交易数据的完整性、保密性。例如,当消…

jenkins引用多个maven配置

普通项目都是用maven打包,有个特殊的项目是用到单独本地的maven库。 jenkins配置maven构建选项选择对应的maven名称即可本帖子也是纯手工制作,转载请标明出处-----------burukku(づ。◕ᴗᴗ◕。)づ

Java EE改名Jakarta EE,jakarta对程序的影响

Spring Framework作为Java领域最为流行的框架,有非常庞大的用户群体和项目应用,Java开源框架里绝对的TOP1。我们首先看看Java EE更名Jakarta对Spring Framework的影响。Spring Framework 6正式发布,携JDK 17&Jakarta EE开启新篇章,Spring Framework为何一跃将JDK的base…

硬盘二次开盘数据恢复

硬盘二次开盘数据恢复是一个相对复杂且风险较高的过程,通常发生在首次开盘数据恢复失败或未能完全恢复数据的情况下。 一、二次开盘的定义与背景 定义:硬盘二次开盘指的是在硬盘首次开盘数据恢复失败后,再次对硬盘进行开盘操作以尝试恢复数据的过程。 背景:硬盘开盘通常是因…

记一次aspnetcore发布部署流程初次使用k8s

主题: aspnetcorewebapi项目,提交到gitlab,通过jenkins(gitlab的ci/cd)编译、发布、推送到k8s。 关于gitlab、jenkins、k8s安装,都是使用docker启动服务。 首先新建一个项目,为了方便浏览就把swaggerr非开发环境不展示去掉 下面就是需要准备Dockerfile和k8s.yaml文件,这里…

硬盘数据误删格式化数据恢复

立即停止使用硬盘 在意识到硬盘数据被误删或格式化后,应立即停止使用该硬盘。任何新的数据写入都可能覆盖原始数据,从而降低恢复的可能性。 数据恢复 数据恢复软件是恢复误删或格式化数据的有效手段。以下是一些知名的数据恢复软件及其使用方法: 安装与选择模式:在格式化的…

bev_feature与真实坐标的关系

在生成 BEV feature 时的 scatter: nx = int((point_cloud_range[3]-point_cloud_range[0])/voxel_size[0])# Create the canvas for this sample canvas = torch.zeros(self.in_channels,self.nx * self.ny,dtype=voxel_features.dtype,device=voxel_features.device)# coors[…

【设计模式(六)】结构性模式--代理模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大…

面试必会之事物控制

01- 什么是事务 ? 事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元 02- 事务的特性有哪些 ?原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性…

字节面试 用double,1.0-0.9的结果不是0.1,为什么?

让我详细解释一下为什么 1.0 - 0.9 在二进制中不能精确表示。 1.0 的二进制表示 1.0 在二进制中可以精确表示。它的二进制表示为: 1.0 = 1.0 (二进制)0.9 的二进制表示 0.9 是一个无法在二进制中精确表示的小数。二进制小数是通过求和 1/2, 1/4, 1/8, 1/16, ... 等幂次表示的。…

关于oracle中的undo

一,undo介绍 二,undo视图说明 三,常用脚本说明 四.释放UNDO表空间 五.参考 一,undo介绍 Oracle中 undo的作用主要有两个:第一是回滚事务,第二是产生一致性读。同时也衍生出了一些新的 功能,比如Flashback query。传统的 undo是通过undo segment 来管理的,我们看下面的示…