springboot2+JPA 配置多数据源(不同类型数据库)

article/2025/9/30 5:10:17

注意:看此篇文章之前,springboot+jpa的配置环境应搭建好,不会搭可以自行百度。本文章主要讲述配置JPA多数据源。

1.数据源配置文件

application.properties

# 数据源thirded(oracle数据库)
spring.jpa.thirded.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.thirded.show-sql=false
spring.jpa.thirded.hibernate.ddl-auto=none# 数据源fourth (mysql数据库)
spring.jpa.fourth.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.fourth.show-sql=true
spring.jpa.fourth.hibernate.ddl-auto=none

上面的 thirded 和 fourth 是我给这两个数据源起的别名

application.yml

spring:datasource:thirded:url: jdbc:oracle:thin:@//127.0.0.1:1521/orclusername: lpsgtpassword: lpsgtdriverClassName: oracle.jdbc.OracleDriverdatabase: oracleconfiguration:maximum-pool-size: 30fourth:url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghaiusername: rootpassword: rootdriverClassName: com.mysql.cj.jdbc.Driverdatabase: mysqlconfiguration:maximum-pool-size: 30

2.创建数据源配置类

数据源管理类:DataSourceConfig.java

package com.lns.analysis.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean("thirdedProperties")@ConfigurationProperties(prefix = "spring.datasource.thirded")public DataSourceProperties thirdedProperties() {return new DataSourceProperties();}@Bean("fourthProperties")@ConfigurationProperties(prefix = "spring.datasource.fourth")public DataSourceProperties fourthProperties() {return new DataSourceProperties();}@Bean(name = "thirdedDataSource")public DataSource thirdedDataSource(@Qualifier(value = "thirdedProperties") DataSourceProperties dataSourceProperties) {DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();return dataSource;}@Bean(name = "fourthDataSource")public DataSource fourthDataSource(@Qualifier(value = "fourthProperties") DataSourceProperties dataSourceProperties) {DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();return dataSource;}
}

DataSourceConfig.java该类主要读取了配置文件里的参数,然后根据参数初始化自动生成数据源,提供数据库连接。

配置多个数据源时,注意每个数据源对应的实体类,jpa类单独放一个包里面

thirded数据源——JPA配置类:

package com.lns.analysis.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;@Slf4j
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.lns.analysis.repository.thirded",entityManagerFactoryRef = "thirdedEntityManagerFactory",transactionManagerRef = "thirdedTransactionManager")
public class ThirdedConfig {@Bean(name = "thirdedJpaProperties")@ConfigurationProperties(prefix = "spring.jpa.thirded")public JpaProperties jpaProperties() {return new JpaProperties();}@Bean(name = "thirdedEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("thirdedDataSource") DataSource thirdedDataSource,@Qualifier("thirdedJpaProperties") JpaProperties jpaProperties,EntityManagerFactoryBuilder builder) {LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean =builder// 设置数据源.dataSource(thirdedDataSource)// 设置jpa配置.properties(jpaProperties.getProperties())// 设置hibernate配置.properties(new HibernateProperties().determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))// 设置实体包名.packages("com.lns.analysis.domain.thirded")// 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源.persistenceUnit("thirdedPersistenceUnit").build();return localContainerEntityManagerFactoryBean;}@Bean(name = "thirdedEntityManager")public EntityManager entityManager(@Qualifier("thirdedEntityManagerFactory") EntityManagerFactory factory) {return factory.createEntityManager();}@Bean(name = "thirdedTransactionManager")public PlatformTransactionManager transactionManager(@Qualifier("thirdedEntityManagerFactory") EntityManagerFactory factory) {return new JpaTransactionManager(factory);}
}

这个JPA配置类获取到了 第2节 中的DataSource数据源,配置文件,然后扫描JPA的包路径下所有配置类。

注意:上述代码包含了JPA类的所在包名,配置文件。跟我不一样的地方,注意要替换成你的。
 

com.lns.analysis.repository.thirded:JPA存储库包名
spring.jpa.thirded:上面第1节数据源配置文件里的配置
com.lns.analysis.domain.thirded:实体类包名

fourth数据源——JPA配置类:

package com.lns.analysis.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;@Slf4j
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.lns.analysis.repository.fourth",entityManagerFactoryRef = "fourthEntityManagerFactory",transactionManagerRef = "fourthTransactionManager")
public class FourthConfig {@Bean(name = "fourthJpaProperties")@ConfigurationProperties(prefix = "spring.jpa.fourth")public JpaProperties jpaProperties() {return new JpaProperties();}@Bean(name = "fourthEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("fourthDataSource") DataSource fourthDataSource,@Qualifier("fourthJpaProperties") JpaProperties jpaProperties,EntityManagerFactoryBuilder builder) {LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean =builder// 设置数据源.dataSource(fourthDataSource)// 设置jpa配置.properties(jpaProperties.getProperties())// 设置hibernate配置.properties(new HibernateProperties().determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))// 设置实体包名.packages("com.lns.analysis.domain.fourth")// 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源.persistenceUnit("fourthPersistenceUnit").build();return localContainerEntityManagerFactoryBean;}@Bean(name = "fourthEntityManager")public EntityManager entityManager(@Qualifier("fourthEntityManagerFactory") EntityManagerFactory factory) {return factory.createEntityManager();}@Bean(name = "fourthTransactionManager")public PlatformTransactionManager transactionManager(@Qualifier("fourthEntityManagerFactory") EntityManagerFactory factory) {return new JpaTransactionManager(factory);}
}

跟上面thirded的配置一样,注意包名、路径需要更换成你的

以上2个数据源的配置部分就已经完成了,运行项目,如果没有报错就是配置成功了。

多数据源的使用:不用额外的操作,因为我们已经用配置类配置好了,还是像之前单个数据源一样接口调用增删改查接口。

调用示例:


http://chatgpt.dhexx.cn/article/0gPNHjoP.shtml

相关文章

jpa配置(jpa配置连接池)

JPA的实体状态有哪些呢? 该接口拥有众多执行数据查询的接口方法: Object getSingleResult():执行SELECT查询语句,并返回一个结果; List getResultList() :执行SELECT查询语句,并返回多个结果&…

SpringBoot系列之数据库初始化-jpa配置方式

上一篇博文介绍如何使用spring.datasource来实现项目启动之后的数据库初始化,本文作为数据库初始化的第二篇,将主要介绍一下,如何使用spring.jpa的配置方式来实现相同的效果 I. 项目搭建 1. 依赖 首先搭建一个标准的SpringBoot项目工程&am…

Jpa环境配置及入门(增删改查)

案例:客户的相关操作(增删改查) 1.分析: 1.搭建环境: 创建maven工程,导入相关坐标; 配置使用jpa的核心配置文件; 位置;需要配置到类路径下叫做 META-INF的文件夹下 命…

PHP多国语言开发:CodeIgniter 2PHP框架中的多国语言,语言包(i18n)库

PHP多国语言开发:CodeIgniter 2PHP框架中的多国语言,语言包(i18n)多国语言库 引言 我们在CodeIgniter开发中经常会碰到多国语言网站,这里我们就来介绍一种简单有效的多国语言的操作方法。 做什么 语言在地址中是这…

Win 10 添加多国语言

不同用户对电脑系统的语言需求也不一样,出于工作原因需要使用其它语言,比如外国友人需要使用英语,俄罗斯语言等,此时很多用户都以为要下载对应语言版本的系统,然后重新安装系统,其实Win10是支持多国语言的&…

手工编译Flex SDK 多国语言包

项目需要将目前版本提供给其它地区:台湾、日韩等,面临着项目语言的国际化问题。 语言代号: 大陆:zh_CN 台湾:zh_TW 香港:zh_HK … 例如想支持繁体,没有zh_TW语言包怎么办? fl…

DevExpress去除多国语言包

DevExpress作为windows开发中较为强大的第三方组件,能极大的提高编程效率和界面效果。但也要引用它较多的dll文件,它专门有个查看dll程序集依赖的工具,在VS的工具菜单下: 在VS的工具菜单内有"DevExpress Assembly Deploymen…

关于VS编译DevExpress默认产生几个多余的多国语言包的问题解决

关于VS编译DevExpress默认产生几个多余的多国语言包的问题解决 VS15开始对于非系统的Dll都会默认复制到本地,即bin\debug下面,复制dll到本地好处在于发布的时候不用再去寻找相关dll,对于dev这么庞大的组件来说,更是如此,当然&…

php源码添加多国语言包,为win7系统添加多国语言包的方法

现在使用win7系统的人越来越多了,对于一些需求也是有所增长,很多用户希望能够将自己的操作系统安装成英文,法文,德文等语言,尤其是对经常出去外国出处的用户很有好吃,比如要和外国客户沟通交流时能看的懂自…

laravel框架安装多国语言包

laravel的一些提示信息都是默认英文,想更改为中文需要下载语言包,执行以下命令 composer require caouecs/laravel-lang:~3.0 执行完后将vendor中的caouecs中的src中的zh-CN文件夹放到views的lang文件夹中 然后还要更改配置项,将config里面…

window10c语言下载,[下载备用]Windows 10多国语言包和独立语言包下载

微软在上周发布Windows 10 周年更新版本之前,已经更新了微软支持库中的Windows 10多国语言包。 此次更新的Windows 10 多国语言包已经可以支持到Windows 10 Version 1607版本,也就是Windows 10 周年更新版本。 不过完整的多国语言包含有超过100种语言的独…

Android多国语言包

生成中文名称的APP如下: step1. step2. step3. step4. step5. 以上步骤仅仅是添加values-zh-rCN文件夹,在AS的res中是看不到的,即使同步后。 这是因为里面没有内容,只需要把默认的string.xml copy到刚才的文件夹中,将…

android语言包,安卓系统添加多国语言包

虽然Android 从 2.3 开始已经支持50种以上的语言,但是不是每种语言都有字体可以显示。遇到一个新需求, 有客户要求对 hindi  语言的支持。于是上 网找了一些资料,发现网上介绍的大部分是如何替换默认字体,就 是替换./works//data/fonts /DroidSansFallback.ttf,但是替换完…

invoke和begininvoke的使用

首先说下,invoke和begininvoke的使用有两种情况: 1. control中的invoke、begininvoke。 2. delegrate中的invoke、begininvoke。 这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。 con…

异步编程模式BeginInvoke和EndInvoke方法

转载自:异步编程模式BeginInvoke与EndInvoke方法 为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传…

C# 异步委托 BeginInvoke EndInvoke

1. 简单主线程中委托: static void Main(string[] args) {//定义一个委托&#xff0c;并初始化Func<int, int, string> delFunc (a, b) > (a b).ToString();//黄色底纹部分换成{ return (a b).ToString(); }更好理解//同步方法调用&#xff08;跟调用一个方法一样…

Invoke and BeginInvoke

本文转自&#xff1a;http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate&#xff0c;至于委托的本质请参考我的另一随笔&#xff1a;对.net事件的看法。 一、为什么Control类提供了Invoke和…

C# Thread Delegate MethodInvoker Invoke BeginInvoke 关系

异步调用是CLR为开发者提供的一种重要的编程手段&#xff0c;它也是构建高性能、可伸缩应用程序的关键。在多核CPU越来越普及的今天&#xff0c;异步编程允许使用非常少的线程执行很多操作。我们通常使用异步完成许多计算型、IO型的复杂、耗时操作&#xff0c;去取得我们的应用…

C#中Delegate/Control的Invoke/BeginInvoke/EndInvoke

目录 一、前言 二、背景 三、Delegate的Invoke/BeginInvoke/EndInvoke 1、基于[需求1] 1.1、直接在主线程中运行“耗时操作” 1.2、通过Thread将“耗时操作”放在子线程中运行 1.3、通过Delegate.BeginInvoke()将“耗时操作”放在子线程中运行 1.4、总结 2、基于[需求…

Invoke和BeginInvoke理解

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate&#xff0c;至于委托的本质请参考我的另一随笔&#xff1a;对.net事件的看法。 一、为什么Control类提供了Invoke和BeginInvoke机制&#xff1f; 关于这个问题的最主要的原因已经是dotnet程序员众所周知的&…