Springboot集成Flyway(适用于多数据源)

news2025/1/18 7:37:35

1. Flyway

可以将初始化sql在项目启动时候执行,取代单独的DBN更新包

2. 依赖

<dependency>
		<groupId>org.flywaydb</groupId>
		<artifactId>flyway-core</artifactId>
		<version>5.2.1</version>
</dependency>

3. 配置说明(springboot配置版本)

配置名配置说明
flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.

4. API方式集成

import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.configuration.ClassicConfiguration;
import org.flywaydb.core.api.configuration.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.nio.charset.Charset;

/**
 * @author pp_lan
 * @description
 */
@Component
public class MainDataSourceMigration {

    private static final Logger LOGGER = LoggerFactory.getLogger(MainDataSourceMigration.class);

    @Autowired
    @Qualifier("mainDataSource")
    private DataSource dataSource;

    /**
     * 生成配置
     * @param location 配置路径
     * @param dataSource 数据源
     * @return
     */
    public Configuration buildConfiguration(String location, DataSource dataSource) {
        ClassicConfiguration configuration = new ClassicConfiguration();
        configuration.setBaselineOnMigrate(true);
        configuration.setTable("java_record_version");

        configuration.setEncoding(Charset.forName("utf-8"));
        configuration.setOutOfOrder(true);
        configuration.setLocationsAsStrings(location);
        configuration.setDataSource(dataSource);

        return configuration;
    }

    @PostConstruct
    public void init() {

        Configuration configuration = buildConfiguration("db/migration/main", dataSource);

        Flyway flyway = new Flyway(configuration);
        try {
            flyway.migrate();
            LOGGER.info("初始化Sql成功");
        } catch (Exception e) {
            flyway.repair();
            LOGGER.error("初始化Sql异常", e);
        }
    }
}

5. 屏蔽配置启动方式

springboot中默认使用flyway配置进行加载,使用api方式进行灵活配置时候需要将其(FlywayAutoConfiguration)进行屏蔽,不然会报错,部分报错信息屏蔽方式如下所示

5.1 报错信息

Caused by: java.lang.reflect.InvocationTargetException: null
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:70)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
	... 18 common frames omitted
Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) `xxxx` without schema history table! Use baseline() or set baselineOnMigrate to true to initialize the schema history table.
	at org.flywaydb.core.Flyway$1.execute(Flyway.java:1371)
	at org.flywaydb.core.Flyway$1.execute(Flyway.java:1341)
	at org.flywaydb.core.Flyway.execute(Flyway.java:1696)
	at org.flywaydb.core.Flyway.migrate(Flyway.java:1341)
	... 25 common frames omitted

5.2 屏蔽方法

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class HzBaseApplication {

	public static void main(String[] args) {
		SpringApplication.run(HzBaseApplication.class, args);
	}

}

6. 执行结果

6.1 日志

2022-12-16 11:20:34,800 INFO (DruidDataSource.java:998)- {dataSource-1} inited
2022-12-16 11:20:35,116 INFO (Slf4jLog.java:49)- Database: jdbc:mysql://106.14.11.239:3306/hz_base (MySQL 5.7)
2022-12-16 11:20:35,343 INFO (Slf4jLog.java:49)- Successfully validated 1 migration (execution time 00:00.105s)
2022-12-16 11:20:35,492 INFO (Slf4jLog.java:49)- Current version of schema `hz_base`: 1.0.0
2022-12-16 11:20:35,493 WARN (Slf4jLog.java:53)- outOfOrder mode is active. Migration of schema `hz_base` may not be reproducible.
2022-12-16 11:20:35,509 INFO (Slf4jLog.java:49)- Schema `xxxx` is up to date. No migration necessary.
2022-12-16 11:20:35,565 INFO (MainDataSourceMigration.java:56)- 初始化Sql成功

6.2 数据库验证

 7. 扩展多数据源

多数据源通过buildConfiguration构建多个配置(数据源及script脚本),执行多次即可完成多数据源sql的初始化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动作捕捉技术中分辨率和频率的重要性

对于光学动作捕捉设备来说&#xff0c;其核心产品——光学动作捕捉镜头&#xff0c;分为多种不同规格参数&#xff0c;本文将介绍其中影响光学动作捕捉设备效果的两个重要参数&#xff1a;分辨率与频率。 分辨率&#xff1a; 被捕捉的反光标记点在镜头画面中以像素形式呈现&a…

【JavaWeb】JSONAJAXi18n

文章目录一.JSON的使用1.在JavaScript中的使用2.在java中的使用二.AJAX请求1.AJAX请求2.原生AJAX请求实例3.jQuery中的AJAX请求三.i18n1.概念2.国际化三要素3.国际化资源properties测试4.实现国际化JSON是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成…

2022年网络安全比赛--压缩包文件暴力破解中职组(超详细)

2022年比赛压缩包文件暴力破解解析 一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机服务版本信息,将 Telnet 版本信息字符串作为 Flag 提交; 2. 通过本地PC中渗透测试平台Kali对…

Odoo 16 企业版手册 - 采购之代发货

代发货(直运) 待发货方式是不打算保留库存的供应商可用的便捷运输方式之一。此方法将允许您将产品直接从供应商运送到客户。这对零售商更有利&#xff0c;因为交货直接从供应商到客户&#xff0c;没有必要保留仓库。直接发货方法将帮助您直接从供应商或制造商将产品运送给客户&…

设计模式概述之抽象工厂模式(三)

上次咱们说了工厂方法模式&#xff0c;不知道各位同学掌握了没有。今天咱们说说“抽象工厂模式”。 抽象工厂&#xff08;AbstractFactory&#xff09;模式的定义&#xff1a;是一种为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具…

计算机网络——CSMA-CA协议

CSMA-CD协议是对碰撞的检测&#xff0c;CSMA-CA协议是对碰撞的避免 CSMA-CD和CSMA-CA应用场景不一样&#xff0c;CSMA-CA协议主要用于无线局域网&#xff0c;CSMA-CD应用与总线式以太网。 无线局域网用CSMA-CD协议无法做到360检测碰撞 隐蔽站&#xff1a;A和C都检测不到信号&am…

Oracle---视图

Oracle之视图和物化视图 文章目录Oracle之视图和物化视图视图优点创建视图带检查约束视图只读视图创建带错误的视图删除视图查询视图物化视图&#xff08;实体化视图&#xff09;区别和优点创建物化视图创建手动刷新的物化视图执行下列语句刷新创建自动刷新的物化视图创建时不生…

Java日志框架简介

一、java日志发展线路图 上面涵盖了java世界里主要的日志框架或门面 二、日志门面和框架的区别 日志框架技术 JUL、Logback、Log4j、Log4j2 用来方便有效地记录日志信息 日志门面技术 JCL、SLF4j 为什么要使用日志门面技术&#xff1a; 每一种日志框架都有自己单独的API&am…

[附源码]Python计算机毕业设计高校学生管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

自学一个月pyhon找到工作,半年成为多个平台关注破万的小作者

前言 干货来了&#xff0c;浓缩了我学习python的所有学习经历&#xff0c;从中获取到的经验分享给你&#xff0c;如果你看了没用&#xff0c;那让我打你一拳。 大学 高中的我&#xff0c;考了三次高考才勉强考上一个二本大学一本数学专业&#xff0c;你没听错&#xff0c;三…

基于C语言实现(控制台)学生成绩管理系统【100010051】

学生成绩管理系统 说明&#xff1a; 注册密码&#xff1a;2014052421程序包含中文和特殊字符&#xff0c;在 Window 下需 ASCII 编码&#xff0c;不能 UTF-8 编码。程序对三个文件要求是文本文件&#xff0c;且 studata.txt 中包含中文字符&#xff0c;在 window 下也需要 AS…

全网惟一面向软件测试人员的Python基础教程-在Python中如何优雅的切西瓜呢?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

第03讲:Security之用户鉴权

一、创建项目 参考&#xff1a;浅试Security 二、实现用户鉴权 何为鉴权&#xff1f;说白了其实就是用户认证&#xff0c;用户输入用户名和密码&#xff0c;只有认证通过了才能使用我的系统。 在实际的项目开发中&#xff0c;账号和密码都是从数据库中查询出来的。所…

820爆炸案(模拟案件)

文章目录模拟案件背景相关密码快压word邮箱BitLocker系统证书bestcrypt涉案图片模拟案件背景 8月20日18&#xff1a;00某市汽车站发生一起爆炸案件&#xff0c;经初步侦查&#xff0c;炸弹系通过手机远程引爆&#xff0c;办案人员经过综合研判分析&#xff0c;确定了引爆炸弹的…

在Mac电脑上怎么修改移动硬盘的读写权限?怎样修改mac电脑中移动硬盘的权限

在Mac电脑上怎么修改移动硬盘的读写权限&#xff1f;你是否遇到过把外部硬盘连接到Mac电脑后&#xff0c;外部硬盘只能读取不能写入的问题&#xff1f;大部分的情况是因为硬盘格式可能是Windows系统的格式&#xff0c;导致在mac电脑上只能读取不能写入。那我们要怎么才能正常的…

腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!

前言: 可以毫不夸张地说&#xff0c;这篇文章介绍的 SpringBoot 教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法&#xff0c;文中都会都会有详细的教程解释。 本文总共从29个章节&#xff0c;248页PDF&#xff0c;阐述springboot在各种环境下的…

计算机毕设Python+Vue校园心理咨询平台(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Servlet应用(Request+response对象)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

测试架构师需要具备哪些能力?

目录 前言 为什么软件项目需要架构设计&#xff1f; 测试架构师需要解决什么问题&#xff1f; 测试架构师需要具备哪些能力&#xff1f; 测试工程师如何培养架构能力&#xff1f; 总结 重点&#xff1a;配套学习资料和视频教学 前言 相比于我们常见的研发架构师&#x…

微信机器人的构建与使用

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2022.12.15 Last edited: 2022.12.15 目录 《微信机器人》程序使用说明 微信机器人使用说明 1&#xff0e;项目说明 2. 系统环境 3.准备条…