Flyway针对多数据源配置实战方案

Springboot集成Flyway(适用于多数据源) springboot使用API方式灵活对接flyway 阅读详情

Flyway针对多数据源配置实战方案

介绍

这篇文章主要介绍Flyway、Druid和多数据源结合起来如何配置和使用的方案。网上一些文章似乎都没有达到一开始我自己琢磨想要的程度,还是自己琢磨和调试出来了一套方案,欢迎大家斧正。

引入pom文件

首先引入对应的pom文件

<!-- flyway -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.4.4</version>
</dependency>
<!--Druid数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.4</version>
</dependency>
<!--多数据源-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

application.yml文件配置

spring:
  autoconfigure:
    # 排除 Druid 自动配置
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    # 指定使用 Druid 数据源
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      datasource:
        goods:
          driverClassName: com.mysql.cj.jdbc.Driver
          url: 
          username: 
          password: 
        order:
          driverClassName: com.mysql.cj.jdbc.Driver
          url: 
          username: 
          password: 
        seckill:
          driverClassName: com.mysql.cj.jdbc.Driver
          url: 
          username: 
          password: 
      primary: order # 设置默认的数据源或者数据源组,默认值即为master
      strict: true # 严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
    druid:
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效
      validationQuery: SELECT 1 FROM DUAL
  flyway:
    enabled: true
    # 版本更新历史记录表
    table: t_db_version
    # 非空数据库初始化Flyway时需要打开此开关进行Baseline操作
    baseline-on-migrate: true
    # 是否可以无序执行。开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder
    out-of-order: true
    # 迁移前校验 SQL 文件是否存在问题
    validate-on-migrate: true
    locations: classpath:db/order # 这里写主库路径,然后在配置类中转换

这里的主库为order,从库为goods和seckill。

这里解释下,为什么网上的很多方案都不行的原因就是,如果这里的localtions配置为db或者db/migration这样存在所有flyway版本sql的路径,则最终结果会导致项目跑起来,flysqy会在主库中出现所有其他从库的表和自己主库本该有的表。

所以这里要结合flyway配置类来,配置类代码下面介绍。

项目文件夹结构

展示下项目文件夹结构。
项目文件夹结构图.jpg

Flyway配置类

关于配置类的代码如下。结合上面的图,其实本质就是将application文件的flyway的locations设置为db/order这个主库的路径,让主库只去执行order下的sql文件,然后在配置类中拆解locations,重新组成为db这个路径,然后再组合对应的库的名字。这个方案也是自己调试和探索出来的。

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flywaydb.core.Flyway;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.Map;

@Slf4j
@Configuration
@RequiredArgsConstructor
@EnableTransactionManagement
public class FlywayConfig {

    private final DataSource dataSource;

    @Value("${spring.flyway.locations}")
    private String SQL_LOCATION;

    @Value("${spring.flyway.table}")
    private String VERSION_TABLE;

    @Value("${spring.flyway.baseline-on-migrate}")
    private boolean BASELINE_ON_MIGRATE;

    @Value("${spring.flyway.out-of-order}")
    private boolean OUT_OF_ORDER;

    @Value("${spring.flyway.validate-on-migrate}")
    private boolean VALIDATE_ON_MIGRATE;

    @Bean
    @PostConstruct
    public void migrateOrder() {
        log.info("调用数据库生成工具");
        SQL_LOCATION = SQL_LOCATION.split("/")[0]; // 将路径转换
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        Map<String, DataSource> dataSources = ds.getDataSources();
        dataSources.forEach((k, v) -> {
            log.info("正在执行多数据源生成数据库文件 " + k);
            Flyway flyway = Flyway.configure()
                    .dataSource(v)
                    .locations(SQL_LOCATION + "/" + k)
                    .baselineOnMigrate(BASELINE_ON_MIGRATE)
                    .table(VERSION_TABLE)
                    .outOfOrder(OUT_OF_ORDER)
                    .validateOnMigrate(VALIDATE_ON_MIGRATE)
                    .load();
            flyway.migrate();
        });
    }

}

完成。

多数据源 使用 flyWay 进行数据库管理 flyway是一个开源的数据库迁移工具,它能够自动管理SQL脚本的执行,从而使数据库版本控制和升级变得更加容易。它支持各种数据库(Oracle,MySQL,PostgreSQL,SQL Server等)和多种脚本语言(SQL,Java,Groovy等)。用户可以使用命令行或API将SQL脚本打包在项目中,然后在开发过程中对数据库进行管理和升级。flyway对于Web开发人员来说是非常有用的,它可以自动检测和执行需要执行的脚本 阅读详情

相关推荐

Flyway数据库迁移工具全面指南:从入门到项目整合

Flyway是一款开源数据库版本控制工具,通过管理SQL脚本版本确保不同环境数据库结构的一致性。其核心原理是通过元数据表记录迁移历史,按版本顺序执行SQL脚本。基本使用包括规范命名脚本(V前缀版本化/R前缀可重复)、存放在默认目录(db/migration),并支持Spring Boot自动整合(添加依赖即可)。高级功能涵盖多环境配置、基线化已有数据库、Java迁移和回调机制。常见问题包括脚本校验失败(修改已执行脚本)和版本冲突(重复版本号),需遵循"不修改已执行脚本"原则并严格管理版本号。

一名北漂Java程序员的学习记录! 1757

Flyway支持多数据源

考虑分库分表的场景下,如何实现通过Flyway在多数据源时做数据库版本更新。

xiaoliu_alone的博客 1119

Spring Boot多数据源下Flyway数据库迁移配置实战与避坑指南

数据库版本管理是现代软件开发中保障环境一致性和部署可靠性的核心实践。其核心原理是通过版本化的脚本文件,将数据库结构变更纳入代码版本控制,实现变更的可追溯、可重复和自动化。这项技术对于实现持续集成和持续部署至关重要,尤其在微服务架构下,能有效管理多环境、多数据源的Schema同步。在Java生态中,Flyway作为一款轻量且强大的数据库迁移工具,通过‘迁移即代码’的理念,在应用启动时自动检测并执行未应用的SQL脚本,确保了代码与数据库状态的强绑定。本文聚焦于Spring Boot项目中Flyway的高阶应用场

weixin_29261711的博客 278

springboot集成flyway使用多数据源的一种实现方式

springboot集成flyway使用多数据源的一种实现方式

weixin_42935566的博客 2243

Flyway多数据源管理进阶:用动态路径+API控制实现分库分表迁移

本文深入探讨了Flyway在Springboot多数据源环境下实现分库分表迁移的进阶方案。通过动态路径配置和API编程控制,解决了电商平台128个分片库的Schema同步难题,提升迁移效率15倍。重点介绍了Flyway API的核心配置、Spring动态数据源集成及企业级分布式迁移架构设计。

yy01234的博客 795

Spring Boot集成Quartz:使用Flyway自动化数据库表初始化实战

在Java企业级应用开发中,任务调度是支撑后台作业、定时处理的核心组件。Quartz作为业界广泛采用的调度框架,其持久化机制依赖数据库存储任务状态,确保集群环境下的高可用性。通过JDBC JobStore,Quartz将调度器、触发器与任务详情映射为结构化数据表,实现了任务状态的可靠存储与恢复。为提升部署效率与维护一致性,数据库迁移工具如Flyway应运而生,它通过版本化SQL脚本管理数据库结构变更,使表结构创建与升级过程可追溯、可重复。本文聚焦于Spring Boot项目中,如何整合Flyway与Quar

weixin_34130389的博客 360

JeecgBoot数据同步:多数据源数据同步方案

你是否还在为企业系统中多数据源的数据同步问题而烦恼?不同数据库之间的数据不一致、同步效率低下、操作复杂等问题是否一直困扰着你?本文将为你详细介绍JeecgBoot框架下的多数据源数据同步方案,帮助你轻松解决这些难题。读完本文,你将了解JeecgBoot多数据源同步的核心方法、实现步骤以及实际应用案例,让你能够快速上手并应用到实际项目中。 ## 多数据源同步的核心挑战 在企业级应用开发中,多数据...

gitblog_00771的博客 1121

数据库版本控制实战:Flyway核心机制、集成配置与生产环境最佳实践

在软件工程实践中,数据库版本控制是确保应用持续交付与部署一致性的关键技术。其核心原理在于将数据库的结构与数据变更像应用程序代码一样,纳入版本管理系统中,通过自动化的迁移脚本确保开发、测试、生产等各环境数据库状态的一致与可追溯。这项技术的核心价值在于彻底解决了传统手动执行SQL脚本带来的环境差异、部署混乱和回滚困难等痛点,是实现DevOps和CI/CD流水线不可或缺的一环。其典型应用场景包括团队协作开发、自动化测试环境构建以及生产环境的平滑升级与回滚预案。本文以热门的数据库版本控制工具Flyway为例,深入解

weixin_30628077的博客 386

【工具-Flyway】优雅的数据库版本控制方式,无需每个版本发布数据库变动脚本

一、背景 如果你还在每个版本发布时单独分发数据库变动脚本,甚至简单粗暴的将开发库直接导出并导入生产环境,建议一起来读一下这篇文章。 二、主流方案 这个一般来说就两个: Flyway 和 Liquibase ,如有更优秀的开源技术请大家留言补充。 ✌Flyway VS Liquibase 感兴趣的可以看一下这篇文章,我的总结如下: Flyway 和 Liquibase 都支持数据库重构和版本控制所需的所有功能,并且这两个工具都可以完美集成在 Maven 或 Gradle 构建脚本以及 Spring Boot

Ric的博客 3745

Spring Boot实现多数据库动态连接与配置指南

本文还有配套的精品资源,点击获取 简介:Spring Boot支持动态连接多个数据库,简化了分布式系统或多数据源环境下的复杂配置。本文将展示如何通过配置文件、自定义数据源配置类和Spring Profile实现多数据库的动态切换。还包括如何初始化数据库以及在代码中动态选择数据源的技术细节。 1. Spring Boot单数据源配置基础 1.1 Spring ...

weixin_36019375的博客 4153

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 440

flyway报错: sql injection violation, dbType mysql, druid-version xxx, syntax error: illegal name...

解决driud在使用dynamic配置多数据源下报SQL注入错误:sql injection violation, dbType mysql, , druid-version 1.2.5, syntax error: illegal name...

weixin_45671892的博客 5425

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1975

Kestra数据库迁移:Flyway与Schema管理

在现代工作流编排系统中,数据库schema管理是确保系统稳定性和可扩展性的关键环节。Kestra作为一款基于Java的工作流引擎,采用Flyway作为数据库迁移工具,为开发者提供了强大的schema版本控制能力。本文将深入探讨Kestra如何集成Flyway进行数据库迁移管理,并提供最佳实践指南。 ## Flyway在Kestra中的集成架构 ### 核心组件 Kestra通过Microna...

gitblog_00974的博客 409

保姆级教程:在Windows上用Docker Desktop一键部署Dify 1.0.1(附国内镜像加速)

本文提供在Windows系统上使用Docker Desktop快速部署Dify 1.0.1的详细教程,包括环境准备、国内镜像加速配置、Dify容器部署实战及常见问题解决方案。特别针对国内用户优化,确保快速完成部署并提升开发效率。

weixin_33738555的博客 282

手把手教你用certificate-manager修复Vcenter证书过期问题(附密码重置技巧)

本文详细解析了Vcenter证书过期引发的503服务不可用、密码错误等典型故障现象,并提供了使用certificate-manager工具进行系统性修复的完整步骤。文章重点阐述了证书体系原理、精准诊断方法,并分享了在SSO验证失败时通过vdcadmintool重置密码的关键技巧,帮助管理员快速恢复平台并建立预防性运维策略。

swift5iosmith的博客 460

Spring Boot与JPA集成开发实战指南

JPA(Java Persistence API)作为Java EE的标准ORM规范,通过对象关系映射简化数据库操作。其核心原理基于实体管理器(EntityManager)实现对象与关系数据库的转换,开发者只需关注领域模型而无需编写繁琐的SQL。在Spring生态中,Spring Data JPA进一步通过Repository抽象层减少样板代码,结合Hibernate实现提供开箱即用的分页、动态查询等高级特性。这种技术组合特别适合需要快速迭代的业务系统,如电商平台的订单模块或CMS系统的内容管理。通过Spr

weixin_34075268的博客 360

5-->详解《switch 数据接收驱动框架、mtk7621集成交换芯片mt7530》之一

SWITCH 交换芯片驱动配置: 一、 配置 MDIO 总线 二、配置 MAC 接口 三、基于 MAC 的 DMA 配置 四、设备驱动结构体 五、数据收发包

weixin_38387929的博客 1万+

告别MySQL臃肿配置!用SpringBoot+SQLite开发微服务本地测试环境(2023新版)

本文介绍了一种优化微服务本地开发体验的方案:使用SpringBoot集成轻量级数据库SQLite替代MySQL作为测试环境。该方案通过零配置、文件即数据库的特性,解决了传统数据库环境搭建繁琐、资源占用高的问题,并详细阐述了驱动集成、动态数据源切换策略以及应对SQLite特性差异的最佳实践,旨在提升开发效率和团队协作便利性。

weixin_29211309的博客 230

T527 uart串口配置导致系统进不去

T527 s_uart串口配置导致系统进不去。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 676

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

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

企业级元数据管理终极指南:OpenMetadata架构深度解析与实战部署

在数据驱动的数字化转型时代,企业面临数据孤岛、元数据管理混乱、数据血缘追踪困难等核心挑战。OpenMetadata作为统一元数据平台,通过集中式元数据仓库、深度列级血缘追踪和无缝团队协作,为企业提供完整的数据发现、数据可观测性和数据治理解决方案。本指南将深入探讨如何利用OpenMetadata构建企业级元数据管理平台,解决数据治理的关键痛点。 ## 📊 OpenMetadata架构深度解析

gitblog_00154的博客 98

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 828

蓝绿部署数据库迁移总“打架”?Spring Boot 兼容性破局之道

本文探讨了Spring Boot项目在蓝绿部署中数据库迁移的常见问题与解决方案。主要内容包括: 典型问题场景:如新版本破坏旧数据、事务中断、迁移脚本不可逆、双写冲突等数据库兼容性问题。 核心原则:采用"扩展-收缩"(Expand-Contract)模式,分阶段完成数据库变更,确保新旧版本同时兼容。 具体实践方案: Flyway/Liquibase分阶段迁移脚本编写规范 使用功能开关(Feature Toggle)实现逻辑切换 配置完全独立的数据库实例实现彻底隔离 应用层防御性编程处理字段缺失 注意事项:强调

深山技术宅的博客 348

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

pscad IEEE标准系统搭建说明

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

mysql-开发参考

mysql开发参考

六月的雨 959

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

国产数据库迁移实战:用db-migration解决企业级数据架构升级难题

在数字化转型浪潮中,越来越多的企业选择国产数据库作为核心数据存储方案。然而,在实际迁移过程中,开发团队常常面临以下挑战: **兼容性适配复杂**:不同国产数据库的SQL语法、数据类型存在差异,传统的迁移工具难以完美支持 **版本管理混乱**:多环境部署时,数据库脚本版本不一致导致生产事故频发 **持续集成困难**:自动化流水线中缺乏可靠的数据库变更管理机制 ## 解决方案:db-migra

gitblog_00298的博客 1054

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

下一篇: Android隐藏action bar 和status bar的新方法
steveay
博客等级 码龄8年 78粉丝 16原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值