SpringBoot项目多数据源配置

java项目如何配置多数据源(基于SpringBoot+Mybatis框架) 前言 近期公司接到一个需求,第三方公司和我们有一款同类型的项目,我们需要保证两边公司的数据一致性(两边的同一条数据有相同的唯一标识字段),所以需要他们提供的数据库帐号查询数据进行数据同步的操作。 正文 maven构建的项目利用pom文件引入数据源需要的jar文件 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spri 阅读详情

微信公众号: 【迷你编程世界】 求关注,求点赞 ❥(^_-)


项目中需要,下面演示多数据源配置,包括jdbcTemplate和jpa配置。

step1. 配置数据库:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

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

}

修改配置文件:

spring:
  datasource:
    primary:
      username: root
      password: 123456
      url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=true
      driver-class-name: com.mysql.jdbc.Driver
    secondary:
      username: root
      password: 123456
      url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=true
      driver-class-name: com.mysql.jdbc.Driver

step2. JdbcTempate配置:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class JdbcTemplateConfig {

    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
	@Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

验证结果:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class IcourtApplicationTests {

    @Resource(name = "primaryJdbcTemplate")
    private JdbcTemplate primaryJdbcTemplate;

    @Resource(name = "secondaryJdbcTemplate")
    private JdbcTemplate secondaryJdbcTemplate;

    @Test
    public void contextLoads() {
        //根据id更新用户名称
        primaryJdbcTemplate.update("update t_user set name = ? WHERE id = ?", "张三", 1);
        secondaryJdbcTemplate.update("update t_user set name = ? WHERE id = ?", "李四", 1);
    }


}

同时更新两个数据库的用户姓名,更新结果不同,都可以执行成功:
在这里插入图片描述
在这里插入图片描述

step3. 数据库1JPA配置:

import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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.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.annotation.Resource;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryPrimary",
        transactionManagerRef = "transactionManagerPrimary",
        basePackages = {"c.f.dao.primary"}) //设置Repository(dao)所在位置
public class PrimaryConfig {

    @Resource(name = "primaryDataSource")
    private DataSource primaryDataSource;

    @Resource
    private JpaProperties jpaProperties;

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource)
                .properties(getVendorProperties(primaryDataSource))
                .packages("c.f.pojo.primary") //设置实体类(数据模型)所在位置
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }


    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }

}

step4. 数据库2JPA配置:

import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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.annotation.Resource;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactorySecondary",
        transactionManagerRef = "transactionManagerSecondary",
        basePackages = {"c.i.dao.secondary"}) //设置Repository所在位置
public class SecondaryConfig {

    @Resource(name = "secondaryDataSource")
    private DataSource secondaryDataSource;

    @Resource
    private JpaProperties jpaProperties;

    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondaryDataSource)
                .properties(getVendorProperties(secondaryDataSource))
                .packages("c.i.pojo.secondary") //设置实体类所在位置
                .persistenceUnit("secondaryPersistenceUnit")
                .build();
    }

    private Map<String, String> getVendorProperties(DataSource dataSource) {
        return jpaProperties.getHibernateProperties(dataSource);
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }

}

验证JPA结果:

import com.iflytek.icourt.dao.primary.UserDao;
import com.iflytek.icourt.dao.secondary.SecondaryUserDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class IcourtApplicationTests {

    @Resource(name = "primaryJdbcTemplate")
    private JdbcTemplate primaryJdbcTemplate;

    @Resource(name = "secondaryJdbcTemplate")
    private JdbcTemplate secondaryJdbcTemplate;

    @Resource
    private UserDao primaryUserDao;

    @Resource
    private SecondaryUserDao secondUserDao;

    @Test
    public void contextLoads() {
        //根据id更新用户名称
//        primaryJdbcTemplate.update("update t_user set real_name = ? WHERE id = ?", "张三", 1);
//        secondaryJdbcTemplate.update("update t_user set real_name = ? WHERE id = ?", "李四", 1);
        primaryUserDao.updateNameById("张三", 1);
        secondUserDao.updateNameById("李四", 1);

    }

执行结果与上面完全一致。

以上就是springboot项目多数据源的配置代码示例。

用 PERFORM ... ON COMMIT / ON ROLLBACK 把收尾工作做干净:从 SAP LUW 到 Update Task 的事务钩子实践 ABAP事务钩子机制解析 本文深入探讨SAP ABAP开发中的事务边界管理问题,重点分析PERFORM ... ON COMMIT/ROLLBACK机制: 事务分层:区分Database LUW(数据库提交)和SAP LUW(业务逻辑单元),后者通过COMMIT WORK触发多种收尾动作 钩子机制:PERFORM...ON COMMIT将子程序注册为事务结束回调,在提交/回滚时执行清理工作而非业务更新 执行顺序:钩子程序先于Update Task执行,仍保留当前会话内存上下文 现代实践:建议将FORM仅作为 阅读详情

相关推荐

AD9361快速锁定实战:Profile寄存器配置与频率调谐算法解析

本文深入解析了AD9361射频收发器的快速锁定(Fast Lock)功能,重点阐述了其核心机制——Profile寄存器配置。通过剖析16字节Profile结构,详细讲解了频率调谐算法,包括LO_DIV、LO_INT、LO_FRAC等关键参数的计算,以及如何通过查表获取优化的环路滤波器参数。文章提供了完整的Python算法示例和FPGA实现要点,旨在帮助工程师实现毫秒级甚至微秒级的频率切换,满足跳频通信等高性能应用需求。

weixin_29196315的博客 228

SpringBoot多数据源配置

在日常开发过程中,使用多个数据源已经成为一种常见需求。本文将详细介绍如何在SpringBoot项目中配置和使用多数据源,包括静态配置和动态配置两种方式,从而实现不同数据源的动态切换,以及在实际项目中进行使用并验证。

xugehahaha的博客 1万+

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 189

springboot配置数据源

Spring Framework 为 SQL 数据库提供了广泛的支持。从直接使用 JdbcTemplate 进行 JDBC 访问到完全的对象关系映射(object relational mapping)技术,比如 Hibernate。Spring Data 提供了更多级别的功能,直接从接口创建的 Repository 实现,并使用了约定从方法名生成查询。

yf_1018的博客 8291

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 一文搞懂什么是 Docker?分析容器的工作原理、容器的架构、Docker的优势、使用 Docker的原因。 全程手把手教你Docker的安装与使用,配置阿里云镜像加速、容器常用命令!

寸铁的博客 10万+

记录汇川:自由口通信-梯形图

最常见的就是MODBUS通信协议,指令主要通过RS232和RS485端口进行报文发送,所以通信报文格式可以选择MODBUS RTU通信格式或MODBUS ASCII通信格式。255---Y10-Y17:ON(1111 1111)指令进行报文的发送与接收,但是报文内部的数据格式不是由主站PLC决定, 而是由。修改从站一个保持寄存器数据。修改从站多个保持寄存器数据。读取从站的输出信号状态。读取从站的输入信号状态。读取从站保持寄存器数据。读取从站输入寄存器数据。

m0_61837027的博客 4913

springboot配置多个数据源(两种方式)

在我们的实际业务中可能会遇到;在一个项目里面读取多个数据库的数据来进行展示,spring对同时配置多个数据源是支持的。 本文中将展示两种方法来实现这个功能。 springboot+mybatis 第一种方式: 在配置文件中配置多个数据源,然后通过配置类来获取数据源以及mapper相关的扫描配置 pom.xml &lt;parent&gt; &lt;groupId&gt;org.s...

qq_38058332的博客 10万+

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1728

SpringBoot 之数据源配置

文章目录市面上的几种数据源比对SpringBoot自动装配DataSource原理Hikari 数据源配置Druid 数据源配置配置参数详解配置 Druid 数据源参数配置 Druid 后台管理 Servlet 和 监控 FilterSpringBoot集成Druid连接池数据源 c3p0 并集成 mybatisDruid 多数据源配置 springboot2.0整合druid,以及springboot自动装配DataSource原理 市面上的几种数据源比对 常用的数据库连接池: C3P0、DBCP、Dru

const_ 1万+

基于C++的MMC仿真与PSCAD建模

MMC是一种基于模块化设计的多电平换流器,通常由若干个基本单元(子模块)组成。每个子模块包含一个电容和两个开关,通过控制开关的开闭,实现输出电压的级联和多电平化。高效率:由于开关频率较低,开关损耗小,效率高。高可靠性:模块化设计使得故障模块易于更换,提高了系统的可靠性。灵活扩展:可以通过增加或减少子模块的数量,方便地调整输出电压和功率。PSCAD(Power Systems Computer Aided Design)是广泛应用于电力系统仿真的专业软件,具有强大的建模和仿真能力。

qq_38334677的博客 295

把 ABAP 采购订单增强做成一条可控流水线:BAdI ME_PROCESS_PO_CUST 全流程实战

摘要: SAP MM模块的ME_PROCESS_PO_CUST BAdI提供了采购订单全生命周期的增强点,覆盖从ME2*N事务到BAPI调用的各类场景。该接口通过INITIALIZE、OPEN、PROCESS_*系列方法、CHECK等组成完整处理流水线,支持字段控制、业务校验、数据派生等功能。关键注意事项包括:PROCESS_*方法仅在相关对象变更时触发、字段控制需区分参考键与动态规则、避免递归调用等。该BAdI采用面向对象设计,通过IF_PURCHASE_ORDER_*等接口操作采购单据对象,而非直接修改

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 402

Springboot配置双数据源

双数据源配置

Tony666688888的博客 1502

rk3399开发环境的介绍

由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。

朝气蓬勃 708

SpringBoot项目配置多数据源的两种方式

spring:druid:db1:db2:该类的作用就是初始化数据源DataSource实例,以及初始化SqlSessionFactory实例。这里需要注意的是必须使用来获取会话工厂SqlSessionFactory,不然的话,baseMapper中的生成动态SQL的方法就不能使用了。//mapper模式下的接口层/*** 配置数据源* @return*/@Primary/*** 配置数据源* @return*/@Bean。

weixin_50003028的博客 7133

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring Boot 多数据源配置项目教程

Spring Boot 多数据源配置项目教程 1. 项目目录结构及介绍 springboot-multiple-dataSources-oracle-mysql-mongodb/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── com/ │ │ │ │ ├── example/ │ │ │ │ │ ...

gitblog_01163的博客 1102

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot项目配置多数据源

在实际的项目开发过程中我们会经常遇到一个项目操作多个数据库的问题,也就是多数据源的问题。那么本篇文章将通过一个具体的例子来讲解如何在SpringBoot+Mybatis+Druid+MySQL项目中实现多数据源的配置。 准备 一个springboot项目,可以去官网快速生成一个,如果你不是很清楚怎么生成的话,可以看我之前的文章。 一个可用的MySQL数据库。 数据库方面的准备工作 在本例中我们...

weixin_33979363的博客 309

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

springboot项目配置多数据源记录

对应版本:springboot 1.5.4.RELEASE+dynamic-datasource-spring-boot-starter2.4.2+jdk 1.8 背景 项目需要使用到mysql,oracle不同的数据库所以需要用到不同的数据源,下面记录流程了。 1、导入maven依赖 <!--多数据源配置--> <depend...

qq_20335643的博客 305

springboot项目实现多数据源配置使用dynamic-datasource-spring-boot-starter的操作步骤

springboot项目实现多数据源配置使用dynamic-datasource-spring-boot-starter的操作步骤

weixin_45817985的博客 2657

Springboot 项目配置多数据源

有三个注意点,其一是 @Primary 作用是标记哪个是主数据源(默认不指定数据源时会调用的数据源);其二是 basePackages 配置的是实际mapper路径,不同数据源路径不能混淆;其三是 setMapperLocations 配置的路径要加上 “classpath:” 前缀,才能找到对应包下的 .xml 文件。对应 DriverInfoMapper.xml 配置。不需要再添加 @MapperScan。4.mapper 定义示例。

PANDA博客 310

Spring Boot 多数据源自动切换项目安装和配置指南

Spring Boot 多数据源自动切换项目安装和配置指南 1. 项目基础介绍和主要的编程语言 项目基础介绍 本项目是一个基于Spring Boot的多数据源自动切换示例项目。通过Spring AOP切面技术,实现了在不同数据源之间的自动切换。项目中包含了两个数据源的业务处理类,分别是Test1ServiceImpl和Test2ServiceImpl,并通过DataSourceAspect类处理切...

gitblog_01256的博客 276

【springboot项目多数据源配置】

简单的多数据源配置序言yml相关配置Config配置文件第一种配置@DataSource第二种配置第一步:创建DataSourceConfig配置文件第二步:创建与数据源对应的配置文件指定Mapper结语 序言 这里博主准备了两种方式,自己跟据自己需求使用就好,第一种注解比较简单,但自我感觉相较单一,如果使用多 数据源操作不是很多可以使用注解;第二种配置相对多一些,但是更加方便。这两种配置都需要依赖yml中的数据源配 置,话不多说上代码。 yml相关配置 //此处为yml的多数据源配置,这里的为my

weixin_43898002的博客 3257

springboot项目多数据源配置

springboot项目多数据源配置

captain_zhangYC的博客 3329

SpringBoot项目,配置Redis多数据源

一、maven依赖 Springboot版本: 1.5.6.RELEASE <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--多数据源--> <depend

Cactus_Lrg的博客 638

SpringBoot项目多数据源配置附源码

多数据源配置这块个人感觉也没有什么,只需要注意以下几点就行。具体的内容我就不多说了直接上代码了,更直观一些 1.pom文件 <!-- 引入Dynamic Datasource用于进行多数据源管理 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId

qq_20410965的博客 308

Springboot项目整合MyBatis配置多数据源

Springboot项目整合MyBatis配置多数据源 在项目开发过程中,总会遇到在一个项目中需要访问不同的数据源来完成数据的转移或者数据的分开处理,这个时候我们就需要用到在一个项目中配置多个数据源;目前大多数企业开发过程中都会用到ORM框架直接处理数据,不会使用原生的JDBC操作来处理了,所以接下来要说的是MyBatis所对应的多数据源配置的详细操作。 ...

jianghuafeng0的博客 247
上一篇: IDEA同一窗口打开多个项目
下一篇: java导出word流,静态文件下载
程序员青戈
程序员青戈 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 3万+粉丝 250原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值