最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)的初始化和版本管理操作

 更新時(shí)間:2023年06月16日 11:32:34   作者:-代號(hào)9527  
Flyway?是一款開源的數(shù)據(jù)庫(kù)版本管理工具,它可以很方便的在命令行中使用,或者在Java應(yīng)用程序中引入,用于管理我們的數(shù)據(jù)庫(kù)版本,這篇文章主要介紹了SpringBoot整合Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)的初始化和版本管理,需要的朋友可以參考下

一、Flyway

1、介紹

Flyway 是一款開源的數(shù)據(jù)庫(kù)版本管理工具。它可以很方便的在命令行中使用,或者在Java應(yīng)用程序中引入,用于管理我們的數(shù)據(jù)庫(kù)版本。

官方文檔:https://flywaydb.org/documentation/

2、業(yè)務(wù)痛點(diǎn)

日常開發(fā)中常有以下場(chǎng)景:

  • 一個(gè)系統(tǒng)有多套環(huán)境,更新表的SQL可能會(huì)遺漏某一個(gè)環(huán)境
  • 每次部署一個(gè)新環(huán)境,就得把所有庫(kù)表的創(chuàng)建SQL手動(dòng)執(zhí)行一遍。多希望服務(wù)啟動(dòng),就創(chuàng)建自己需要的庫(kù)表
  • 每次發(fā)版要記錄數(shù)據(jù)庫(kù)變更信息,或者單獨(dú)給出數(shù)據(jù)庫(kù)升級(jí)腳本
  • 別人需求新增了SQL你不知道,系統(tǒng)一跑出來個(gè)數(shù)據(jù)庫(kù)報(bào)錯(cuò)又得問人或者排錯(cuò)

3、個(gè)人理解

flyway,就像數(shù)據(jù)庫(kù)界的Git。git做一個(gè)項(xiàng)目里代碼的版本管理,flyway做一個(gè)項(xiàng)目數(shù)據(jù)庫(kù)的版本管理。

  • Version control for your database.
  • Robust schema evolution across all your environments.
  • With ease, pleasure and plain SQL.

使用了 Flyway 之后,如果再想進(jìn)行數(shù)據(jù)庫(kù)版本升級(jí),就不用改之前的數(shù)據(jù)庫(kù)腳本了,直接創(chuàng)建新的數(shù)據(jù)庫(kù)腳本,項(xiàng)目在啟動(dòng)時(shí)檢測(cè)了有新的更高版本的腳本,就會(huì)自動(dòng)執(zhí)行

二、SpringBoot整合flyway

1、整合 在pom文件中導(dǎo)入flyway依賴

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
  <version>5.2.4</version>
</dependency>
- 注意和springboot之間的版本適配問題
- flyway版本不建議太高

配置文件application或者bootstrap中新加flyway的配置

# flyway 配置
spring:
  flyway:
    # 啟用或禁用 flyway
    enabled: true
    # flyway 的 clean 命令會(huì)刪除指定 schema 下的所有 table, 生產(chǎn)務(wù)必禁掉。這個(gè)默認(rèn)值是 false 理論上作為默認(rèn)配置是不科學(xué)的。
    clean-disabled: true
    # SQL 腳本的目錄,多個(gè)路徑使用逗號(hào)分隔 默認(rèn)值 classpath:db/migration
    locations: classpath:db/migration
    #  metadata 版本控制信息表 默認(rèn) flyway_schema_history
    table: flyway_schema_history
    # 如果沒有 flyway_schema_history 這個(gè) metadata 表, 在執(zhí)行 flyway migrate 命令之前, 必須先執(zhí)行 flyway baseline 命令
    # 設(shè)置為 true 后 flyway 將在需要 baseline 的時(shí)候, 自動(dòng)執(zhí)行一次 baseline。
    baseline-on-migrate: true
    # 指定 baseline 的版本號(hào),默認(rèn)值為 1, 低于該版本號(hào)的 SQL 文件, migrate 時(shí)會(huì)被忽略
    baseline-version: 1
    # 字符編碼 默認(rèn) UTF-8
    encoding: UTF-8
    # 是否允許不按順序遷移 開發(fā)建議 true  生產(chǎn)建議 false
    out-of-order: false
    # 需要 flyway 管控的 schema list,這里我們配置為flyway  缺省的話, 使用spring.datasource.url 配置的那個(gè) schema,
    # 可以指定多個(gè)schema, 但僅會(huì)在第一個(gè)schema下建立 metadata 表, 也僅在第一個(gè)schema應(yīng)用migration sql 腳本.
    # 但flyway Clean 命令會(huì)依次在這些schema下都執(zhí)行一遍. 所以 確保生產(chǎn) spring.flyway.clean-disabled 為 true
    schemas: flyway
    # 執(zhí)行遷移時(shí)是否自動(dòng)調(diào)用驗(yàn)證   當(dāng)你的 版本不符合邏輯 比如 你先執(zhí)行了 DML 而沒有 對(duì)應(yīng)的DDL 會(huì)拋出異常
    validate-on-migrate: true
注意clean-disabled?。?!
- 表示是否要清除已有庫(kù)下的表
- 即執(zhí)行腳本V1__xxx.sql,會(huì)先清除已有庫(kù)下的表??!然后再執(zhí)行腳本
- 設(shè)置為true,即確定關(guān)掉clean功能

resource/db/migration下添加數(shù)據(jù)庫(kù)腳本(這個(gè)路徑是上面配置中寫的)

啟動(dòng)服務(wù),顯示控制臺(tái)可以看到SQL被執(zhí)行,并產(chǎn)生了歷史記錄表

2、SQL文件命名

注意SQL的命名規(guī)范有要求:

舉例:V2.0.1.7__create_core_table.sql
  • V是前綴 表示這個(gè)文件只會(huì)被執(zhí)行一次
  • 2.0.1.7為版本號(hào) ,高版本的執(zhí)行后不會(huì)再執(zhí)行低版本的SQL。如2.0.1.7先執(zhí)行了,2.0.1.6就不會(huì)被執(zhí)行了
  • __ : 兩個(gè)下劃線表示分隔符
  • create_user_table :腳本功能表述
  • .sql: 后綴

注意flyway比較版本的先后是采用左對(duì)齊原則, 缺位用 0 代替,比如

- 1.0.1.1 比 1.0.1 高
- 1.0.10.0 比 1.0.9.9 高
- 1.0.10 和 1.0.010 一樣高

需要執(zhí)行多次的,以大寫"R"開頭,命名如R__insertInfo.sql ,R的腳本只要改變了就會(huì)執(zhí)行,R不帶版本號(hào)。

3、版本號(hào)校驗(yàn)算法

flyway在升級(jí)數(shù)據(jù)庫(kù)時(shí)會(huì)先計(jì)算之前已經(jīng)升級(jí)過的腳本的checksum值和數(shù)據(jù)庫(kù)的checkSum值進(jìn)行比對(duì),如果老腳本發(fā)生了變化后checkSum校驗(yàn)就會(huì)失敗,從而拋出異常,checkSum計(jì)算算法為CRC32 (循環(huán)冗余校驗(yàn)碼)算法

新增的腳本則會(huì)和數(shù)據(jù)庫(kù)中的版本號(hào)進(jìn)行比較,如果小于數(shù)據(jù)庫(kù)存儲(chǔ)的最后一個(gè)版本號(hào),也不會(huì)繼續(xù)執(zhí)行。

4、工作流程

  • 項(xiàng)目啟動(dòng),成功連接到數(shù)據(jù)庫(kù),flyway開始運(yùn)行。
  • 第一次使用,flyway會(huì)創(chuàng)建flyway_schema_history表,用于記錄SQL的執(zhí)行記錄
  • flyway掃描classpath:db/migration路徑下的所有SQL腳本,并與flyway_schema_history表的記錄對(duì)比
- 若表里沒記錄,即新SQL,執(zhí)行并將信息寫入history表
- R開頭的文件只要發(fā)生修改,都會(huì)執(zhí)行一遍
- V開頭的文件,如果上次執(zhí)行過后又發(fā)生了修改,則服務(wù)啟動(dòng)報(bào)錯(cuò)
- 想讓V開頭的已經(jīng)執(zhí)行過的文件再執(zhí)行一次,就得清楚history表中的數(shù)據(jù)后再啟動(dòng)服務(wù)

5、注意事項(xiàng)

  • 報(bào)錯(cuò)后需要?jiǎng)h除flyway_schema_history中記錄,否則啟動(dòng)失敗
  • V文件的優(yōu)先級(jí)高于R,假如三個(gè)V遷移腳本和一個(gè)R(無(wú)論新建還是修改)一起執(zhí)行,其中一個(gè)V報(bào)錯(cuò),則V會(huì)全部執(zhí)行完成且記錄到flyway_schema_history中,而R不執(zhí)行且不記錄,刪除表中報(bào)錯(cuò)記錄后,重新啟動(dòng),則執(zhí)行原錯(cuò)誤V和未執(zhí)行的R
  • 多個(gè)要執(zhí)行的R中,如果出現(xiàn)了其中一個(gè)出現(xiàn)了錯(cuò)誤,則在其后的R都不執(zhí)行
  • R的執(zhí)行順序根據(jù)命名來進(jìn)行排序
  • 一個(gè)文件中ddl并不由一個(gè)事務(wù)管理,比如創(chuàng)建三個(gè)表,中間創(chuàng)建表語(yǔ)句報(bào)錯(cuò),則第一個(gè)表還是會(huì)創(chuàng)建成功并且提交事務(wù)
  • 同一個(gè)遷移文件下假設(shè)都是DML(即insert、delete、update),那么如果中間出現(xiàn)錯(cuò)誤,所有的DML語(yǔ)句都會(huì)回滾
  • 已經(jīng)執(zhí)行過的遷移文件(V)不能修改,否則啟動(dòng)報(bào)錯(cuò)
  • 版本號(hào)相同會(huì)報(bào)錯(cuò)(Found more than one migration with version 1.0.0.9)
  • 刪除sql文件后啟動(dòng)會(huì)報(bào)錯(cuò),報(bào)錯(cuò)如下:

If you removed this migration intentionally, run repair to mark the migration as deleted.

到此這篇關(guān)于SpringBoot整合Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)的初始化和版本管理的文章就介紹到這了,更多相關(guān)SpringBoot整合Flyway內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合activemq的案例代碼

    SpringBoot整合activemq的案例代碼

    ActiveMQ是消息隊(duì)列技術(shù),為解決高并發(fā)問題而生,本文通過案例代碼給大家介紹pringBoot整合activemq的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Java基礎(chǔ)之查找文本特定內(nèi)容后進(jìn)行修改

    Java基礎(chǔ)之查找文本特定內(nèi)容后進(jìn)行修改

    這篇文章主要介紹了Java基礎(chǔ)之查找文本特定內(nèi)容后進(jìn)行修改,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring框架AOP面向切面編程原理全面分析

    Spring框架AOP面向切面編程原理全面分析

    這篇文章主要介紹了Spring框架AOP面向切面編程的全面分析,文中附含詳細(xì)的示例代碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案

    jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案

    這篇文章主要介紹了jenkins按模塊進(jìn)行構(gòu)建的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • MyBatis中的resultMap簡(jiǎn)要概述

    MyBatis中的resultMap簡(jiǎn)要概述

    這篇文章主要介紹了MyBatis中的resultMap簡(jiǎn)要概述的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 使用Java將字符串在ISO-8859-1和UTF-8之間相互轉(zhuǎn)換

    使用Java將字符串在ISO-8859-1和UTF-8之間相互轉(zhuǎn)換

    大家都知道在一些情況下,我們需要特殊的編碼格式,如:UTF-8,但是系統(tǒng)默認(rèn)的編碼為ISO-8859-1,遇到這個(gè)問題,該如何對(duì)字符串進(jìn)行兩個(gè)編碼的轉(zhuǎn)換呢,下面小編給大家分享下java中如何在ISO-8859-1和UTF-8之間相互轉(zhuǎn)換,感興趣的朋友一起看看吧
    2021-12-12
  • @Accessors(chain = true)注解報(bào)錯(cuò)的解決方案

    @Accessors(chain = true)注解報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了@Accessors(chain = true)注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    這篇文章主要介紹了Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Javaweb resin4如何配置端口虛擬目錄

    Javaweb resin4如何配置端口虛擬目錄

    這篇文章主要介紹了Javaweb resin4如何配置端口虛擬目錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring的DI依賴注入詳解

    Spring的DI依賴注入詳解

    這篇文章主要為大家介紹了Spring的DI依賴注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評(píng)論

三门县| 富平县| 宁晋县| 平南县| 七台河市| 汉阴县| 沙坪坝区| 桦甸市| 长宁县| 鸡泽县| 长乐市| 马龙县| 北川| 宜君县| 翼城县| 金溪县| 都匀市| 星座| 额济纳旗| 孟津县| 陇西县| 容城县| 肇州县| 班玛县| 阿坝| 彩票| 宝应县| 磐安县| 胶南市| 广昌县| 分宜县| 彝良县| 工布江达县| 遵义市| 澄迈县| 宁晋县| 黔东| 宝鸡市| 惠水县| 德保县| 微山县|