【Java笔记】Flyway数据库管理工具的基本原理

文章目录

  • 1. 工作流程
  • 2. 版本号校验算法
  • 3. 锁机制
    • 3.1 为什么数据库管理工具需要锁
    • 3.2 flyway的锁机制
  • Reference

最近实习做的几个项目都用到了Flyway来做数据库的版本管理,顺便了解了下基本原理,做个记录。
详细的使用就不写了,网上教程很多。

1. 工作流程

在一个空数据库上部署集成了Flyway的应用:

  1. 因为数据库是空的,Flyway会先创建这个数据库。

  2. Flyway在数据库中创建一张表flyway_schema_histor,用于记录migration的执行情况(跟踪数据库状态)。

  3. Flyway扫描migration脚本,并按版本号顺序执行。

    • 默认的查找 migration 的路径为 classpath:db/migration:
      • 对应 SQL 文件可放置在src/main/resources/db/migration 下;
      • Java 类可放置在 src/main/java/db/migration 下。
        在这里插入图片描述
  4. 变更数据库只需创建一个版本号更高的新migration脚本,下次启动项目时flyway会自动按版本号顺序执行版本号大于flyway_schema_histor表中版本号的脚本

2. 版本号校验算法

flyway在升级数据库时会计算之前已经升级过的脚本的checkSum(CRC32算法,循环冗余校验码),与数据库的checkSum进行对比。

老脚本如果内容发生变化,checkSum校验失败(所以一般老版本的脚本不能修改),抛出异常

3. 锁机制

3.1 为什么数据库管理工具需要锁

上面进行数据库版本更新的changset只需,也只能执行一次。如果我们部署了多个服务实例,就需要锁机制来保证这个changset不会被重复执行。

其实就是分布式锁的经典场景,比如部署了两个service实例,那么肯定需要保证他们互斥访问数据库,也要互斥地管理数据库,Flyway来说就是互斥地执行新脚本,也就是互斥地访问更改flyway_schema_histor

3.2 flyway的锁机制

flyway作为数据库相关的工具,采用的分布式锁的实现方案是基于数据库实现的。

基于数据库实现分布式锁一般有两种:

  • 基于数据库表:比如Liquibase维护了一张databasechangeloglock表来实现分布式锁。

    • 这样有个缺点就是一个service获取锁后还没释放就宕机了,其锁记录一直在DB中,其他线程就无法获取锁。需要手动清理脏锁。
  • 基于数据库排他锁:flyway,直接for update

    @Override
    protected void doLock() throws SQLException {jdbcTemplate.execute("SELECT * FROM " + this + " FOR UPDATE");
    }
    
    • 如果某个持有锁的服务器宕机,其数据库链接也会断开,加在表上的排他锁也会自动释放。不会有Liquibase的那种问题。

Reference

flyway使用
基于数据库实现分布式锁

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

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

相关文章

第一后裔/The First Descendant延迟高的解决方法

第一后裔/The First Descendant是一款备受玩家关注的射击游戏,该作拥有多个角色,并为其设定不同的概念和战斗风格,以及技能点,不仅能让玩家畅快作战,还能通过各种道具,不断强化角色能力值,让其战…

unidbg介绍

1.unicorn介绍 好比是一个CPU,可以模拟执行各种指令 提供了很多编程语言接口,可以操作内存、寄存器等 但它不是一个系统,内存管理、文件管理、系统调用等都需要自己来实现 2.基于unicorn开发的框架 cemu用来学习汇编的工具 AndroidNativeEm…

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

Generative Model-Based Feature Knowledge Distillation for Action Recognition

标题:基于生成模型的特征知识蒸馏用于动作识别 源文链接:Generative Model-Based Feature Knowledge Distillation for Action Recognition| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/artic…

Python笔记 json数据格式的转换

一、json数据格式 1.什么是json json是一种轻量级的数据交互格式。可以按照json指定的格式去组织和封装数据 json本质上是一个带有特定格式的字符串 主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。类似…

计算机网络 DHCP以及防护

一、理论知识 1.DHCP:用于在网络中自动分配IP地址及其他网络参数(如DNS、默认网关)给客户端设备。 2.VLAN:逻辑上的局域网分段,用于隔离和管理不同的网络流量。 3.DHCP地址池:为每个VLAN配置不同的DHCP地…

MySQL锁和使用

在MySQL中,锁用于控制并发访问,以保证数据的一致性和完整性。MySQL提供了多种类型的锁,包括表级锁、行级锁和页面级锁。以下是MySQL中各种锁的详细介绍及其使用方法: 1. 表级锁(Table Locks) 表级锁用于锁…

输出100以内的质数

质数&#xff1a;只能被1和自身整除的数 let count; for(let i2; i<100; i){for(let j1; j<i; j){if(i % j 0){// 只要能被整除&#xff0c;count就加1count;}} if(count 2) {// 从1到自身被整除完之后&#xff0c;如果count只有两次&#xff0c;则说明i为质数co…

大数据------JavaWeb------Maven(完整知识点汇总)

额外知识点 IDE IDE是集成开发环境的缩写&#xff0c;它是一种软件应用程序&#xff0c;提供了编码、调试和部署软件的一站式解决方案。这些功能集成在一起&#xff0c;使开发人员能够在一个环境中完成整个软件开发过程&#xff0c;从编写代码到调试和测试&#xff0c;直到最终…

掌握SEO:如何优化用ChatGPT生成的文章以提升搜索排名

在数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为网站流量的重要来源。随着人工智能技术的进步&#xff0c;越来越多的人开始使用ChatGPT等AI工具来生成文章。然而&#xff0c;虽然这些工具可以快速生成内容&#xff0c;但要确保这些内容在搜索引擎中…

MK米客方德SD NAND磨损均衡技术

上次MK给大家讲解了MK SD NAND异常掉电保护机制&#xff0c;不少的工程师朋友们对此挺感兴趣&#xff0c;今天再和大家聊一聊SD NAND内部的另外一个核心技术SD NAND&#xff1a;磨损均衡&#xff08;Wear Leveling&#xff09;。 SD NAND内部主要由NAND Flash和Flash Controll…

Python操作MySQL数据库--使用pymysql模块

Python操作MySQL数据库--使用pymysql模块 一、新建数据库和数据表1.1 新建book数据库1.2 新建bookprice数据表二、连接数据库2.1 建立数据库连接三、新增数据3.1 新增单条数据3.2 新增多条数据3.3 批量新增四、修改数据4.1 修改单条数据4.2 修改多条数据五、删除数据5.1 删除单…

【Android Studio】Notification通知提醒功能完整代码以及踩坑记录

前言&#xff1a;在最近学习安卓通知功能的开发中&#xff0c;遇到了一些坑&#xff0c;困扰了我一些时间&#xff0c;搜集了大量资料写个博客总结一下&#xff0c;希望对大家有帮助。 目录 一、启动项目闪退 1.1、问题详情 1.2、解决方法 二、点击通知无法跳转 2.1、问题…

ONLYOFFICE8.1新版本桌面编辑器测评

什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文本文档、电子表格、演示文稿、可填写的表单、PDF&#xff0c;可多人在线协作&#xff0c;支持 AI 集成。 该套件可在 Windows、Linux、Android 和 iOS上使用&#xff0c;包括网页…

最大团问题--回溯法

一、相关定义 给定一个无向图 &#xff0c;其中 V 是图的顶点集&#xff0c;E图的边集 完全图&#xff1a;如果无向图中的任何一对顶点之间都有边&#xff0c;这种无向图称为完全图 完全子图&#xff1a;给定无向图 &#xff0c;如果 &#xff0c;且对应任意 且 &#xff0c;则…

x264 码率控制 VBV 算法原理:数学模型与数据流转

x264 码率控制 VBV 算法原理 关于 VBV原理的分析可以参考:x264 码率控制 VBV 原理。关于 VBV 算法的源码分析可以参考:x264 码率控制中实现 VBV 算法源码分析。VBV算法介绍 x264中的VBV(Video Buffering Verifier)算法是H.264编码标准的一部分,主要用于码率控制,确保视频…

【CPP】交换排序:冒泡排序、快速排序

目录 1.冒泡排序简介代码分析 2.快速排序2.1霍尔版本简介代码分析 2.2挖坑版本2.3前后指针版本2.4非递归的快排思路代码 什么是交换排序&#xff1f; 基本思想&#xff1a;所谓 交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0…

2.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这篇文章介绍arduino使用和安装arduino_bridge 将arduino与树莓派连接 查看arduino的端口号&#xff0c;我们这里查看到的时ttyUSB0 ll /dev/ttyUSB*将当前用户添加进dialout组 sudo usermod -a -G dialout your_user_name然后重启树莓派&#xff0c;然后才能生效 然后如果你…

PyCharm2024 for mac Python编辑开发

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

机器人控制系列教程之URDF自动生成工具

URDF文件的编写较为复杂&#xff0c;ROS官方提供了URDF的SolidWorks插件&#xff0c;可方便地将 SW 零件和装配体导出为 URDF 文件。导出器将创建一个类似 ROS 的软件包&#xff0c;其中包含网格、纹理和机器人&#xff08;URDF 文件&#xff09;目录。对于单一的 SolidWorks 零…