亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用

 更新時間:2018年01月08日 12:11:08   作者:南北雪樹  
這篇文章主要介紹了淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了SpringBoot開啟數(shù)據(jù)庫遷移的FlyWay使用,分享給大家,具體如下:

一,首先我先了解下FlyWay是如何運轉(zhuǎn)的。

最簡單的方案是將Flyway指向一個空數(shù)據(jù)庫。

這里寫圖片描述 

它將嘗試找到其元數(shù)據(jù)表。當(dāng)數(shù)據(jù)庫為空時,F(xiàn)lyway將不會找到它, 而是創(chuàng)建它。您現(xiàn)在擁有一個名為SCHEMA_VERSION的單個空表的數(shù)據(jù)庫 :

這里寫圖片描述 

該表將用于跟蹤數(shù)據(jù)庫的狀態(tài)。之后,F(xiàn)lyway將開始掃描應(yīng)用程序的文件系統(tǒng)或類路徑進(jìn)行遷移。它們可以用Sql或Java編寫。
然后根據(jù)其版本號對遷移進(jìn)行排序,并按順序應(yīng)用:

這里寫圖片描述 

隨著應(yīng)用每個遷移,元數(shù)據(jù)表將相應(yīng)更新:

schema_version

這里寫圖片描述 

隨著元數(shù)據(jù)和初始狀態(tài)的到位,我們現(xiàn)在可以談?wù)撨w移到較新的版本。

Flyway將再次掃描應(yīng)用程序的文件系統(tǒng)或類路徑進(jìn)行遷移。根據(jù)元數(shù)據(jù)表檢查遷移。如果版本號低于或等于標(biāo)記為當(dāng)前版本的版本號,則忽略它們。

剩余的遷移是掛起的遷移:可用但未應(yīng)用。

這里寫圖片描述 

然后,他們通過版本號進(jìn)行排序,并依次執(zhí)行:

這里寫圖片描述 

該元數(shù)據(jù)表進(jìn)行更新,因此:

schema_version

就是這樣!每當(dāng)需要發(fā)展數(shù)據(jù)庫時,無論是結(jié)構(gòu)(DDL)還是參考數(shù)據(jù)(DML),只需創(chuàng)建一個版本號高于當(dāng)前版本的新遷移。下一次Flyway啟動時,它會發(fā)現(xiàn)并相應(yīng)地升級數(shù)據(jù)庫。

二,F(xiàn)lyWay在SpingBoot的使用

一種途徑是通過Spring Boot的spring.jpa.hibernate.ddl-auto屬性將hibernate.hbm2ddl.auto屬性設(shè)置為create、 create-drop或update。例如,要把hibernate.hbm2ddl.auto設(shè)置為create-drop,我們可以在application.yml里加入如下內(nèi)容:

spring:
  jpa:
    hibernate:
      ddl-auto: create-drop

然而,這對生產(chǎn)環(huán)境來說并不理想,因為應(yīng)用程序每次重啟數(shù)據(jù)庫, Schema就會被清空,從頭開始重建。它可以設(shè)置為update,但就算這樣,我們也不建議將其用于生產(chǎn)環(huán)境。

還有一個途徑。我們可以在schema.sql里定義Schema。在第一次運行時,這么做沒有問題,但隨后每次啟動應(yīng)用程序時,這個初始化腳本都會失敗,因為數(shù)據(jù)表已經(jīng)存在了。這就要求在書寫初始化腳本時格外注意,不要重復(fù)執(zhí)行那些已經(jīng)做過的工作。
一個比較好的選擇是使用數(shù)據(jù)庫遷移庫(database migration library)。它使用一系列數(shù)據(jù)庫腳本,而且會記錄哪些已經(jīng)用過了,不會多次運用同一個腳本。應(yīng)用程序的每個部署包里都包含了這些腳本,數(shù)據(jù)庫可以和應(yīng)用程序保持一致。Spring Boot為兩款流行的數(shù)據(jù)庫遷移庫提供了自動配置支持。

  1. Flyway(http://flywaydb.org
  2. Liquibase(http://www.liquibase.org

當(dāng)你想要在Spring Boot里使用其中某一個庫時,只需在項目里加入對應(yīng)的依賴,然后編寫腳本就可以了。讓我們先從Flyway開始了解吧。

1. 用Flyway定義數(shù)據(jù)庫遷移過程

Flyway是一個非常簡單的開源數(shù)據(jù)庫遷移庫,使用SQL來定義遷移腳本。它的理念是,每個腳本都有一個版本號, Flyway會順序執(zhí)行這些腳本,讓數(shù)據(jù)庫達(dá)到期望的狀態(tài)。它也會記錄已執(zhí)行的腳本狀態(tài),不會重復(fù)執(zhí)行。在閱讀列表應(yīng)用程序這里,我們先從一個沒有數(shù)據(jù)表和數(shù)據(jù)的空數(shù)據(jù)庫開始。因此,這個腳 本里需要先創(chuàng)建Reader和Book表,包含外鍵約束和初始化數(shù)據(jù)。代碼清單8-2就是從空數(shù)據(jù)庫到 可用狀態(tài)的Flyway腳本。

Flyway數(shù)據(jù)庫初始腳本

create table Reader (
id serial primary key,
username varchar(25) unique not null,
password varchar(25) not null,
fullname varchar(50) not null
);
create table Book (
id serial primary key,
author varchar(50) not null,
description varchar(1000) not null,
isbn varchar(10) not null,
title varchar(250) not null,
reader_username varchar(25) not null,
foreign key (reader_username) references Reader(username)
);
create sequence hibernate_sequence;
insert into Reader (username, password, fullname)
values ('craig', 'password', 'Craig Walls');

如你所見, Flyway腳本就是SQL。讓其發(fā)揮作用的是其在Classpath里的位置和文件名。Flyway腳本都遵循一個命名規(guī)范,含有版本號,具體如圖8-1所示。

這里寫圖片描述 

所有Flyway腳本的名字都以大寫字母V開頭,隨后是腳本的版本號。后面跟著兩個下劃線和對腳本的描述。因為這是整個遷移過程中的第一個腳本,所以它的版本是1。描述可以很靈活,主要用來幫助理解腳本的用途。稍后我們需要向數(shù)據(jù)庫添加新表,或者向已有數(shù)據(jù)表添加新字段??梢栽賱?chuàng)建一個腳本,標(biāo)明版本號為2。Flyway腳本需要放在相對于應(yīng)用程序Classpath根路徑的/db/migration路徑下。因此,項目中, 腳本需要放在src/main/resources/db/migration里。你還需要將spring.jpa.hibernate.ddl-auto設(shè)置為none,由此告知Hibernate不要創(chuàng)建數(shù)據(jù)表。這關(guān)系到application.yml中的如下內(nèi)容:

spring:
jpa:
hibernate:
ddl-auto: none

剩下的就是將Flyway添加為項目依賴。在Gradle里,此依賴是這樣的:

compile(“org.flywaydb:flyway-core”) 

在Maven項目里, 是這樣的:

<dependency>
<groupId>org.flywayfb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

在應(yīng)用程序部署并運行起來后, Spring Boot會檢測到Classpath里的Flyway,自動配置所需的 Bean。 Flyway會依次查看/db/migration里的腳本,如果沒有執(zhí)行過就運行這些腳本。每個腳本都執(zhí)行過后,向schema_version表里寫一條記錄。應(yīng)用程序下次啟動時,F(xiàn)lyway會先看schema_version里的記錄,跳過那些腳本。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐

    這篇文章主要介紹了springboot+RabbitMQ+InfluxDB+Grafara監(jiān)控實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java中SpringBoot自定義Starter詳解

    Java中SpringBoot自定義Starter詳解

    這篇文章主要介紹了Java中SpringBoot自定義Starter詳解,Starter是Spring Boot中的一個非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境進(jìn)行自動配置,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于springboot 配置date字段返回時間戳的問題

    關(guān)于springboot 配置date字段返回時間戳的問題

    這篇文章主要介紹了springboot 配置date字段返回時間戳的問題,在springboot2.0后,spring會將Date字段自動給轉(zhuǎn)成UTC字符串了(在沒有配置的情況下),所以date需要轉(zhuǎn)換成時間戳還是yyyy-MM-dd HH:mm:ss,具體解決方法跟隨小編一起看看吧
    2021-07-07
  • Java 定時器的多種實現(xiàn)方式

    Java 定時器的多種實現(xiàn)方式

    本文介紹了Java中定時器的多種實現(xiàn)方式,有此需求的朋友可以根據(jù)實際選擇適合自己的方式
    2021-06-06
  • Java實現(xiàn)順序表和鏈表結(jié)構(gòu)

    Java實現(xiàn)順序表和鏈表結(jié)構(gòu)

    大家好,本篇文章主要講的是Java實現(xiàn)順序表和鏈表結(jié)構(gòu),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Redisson分布式鎖源碼解析

    Redisson分布式鎖源碼解析

    文章給大家分享了關(guān)于Redisson分布式鎖源碼相關(guān)的知識點內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • Gateway如何實現(xiàn)全局跨域

    Gateway如何實現(xiàn)全局跨域

    這篇文章主要介紹了Gateway如何實現(xiàn)全局跨域問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 實時計算知多少?

    實時計算知多少?

    這篇文章對滑動窗口計數(shù)的概念和關(guān)鍵代碼做了較為詳細(xì)解釋,讓我們對實時計算這一概念有了更深的了解,需要的朋友可以參考下
    2015-07-07
  • Java SpringMVC實現(xiàn)國際化整合案例分析(i18n)

    Java SpringMVC實現(xiàn)國際化整合案例分析(i18n)

    本篇文章主要介紹了Java SpringMVC實現(xiàn)國際化整合案例分析(i18n),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java 實現(xiàn)Comparable接口排序,升序、降序、倒敘

    java 實現(xiàn)Comparable接口排序,升序、降序、倒敘

    這篇文章主要介紹了java 實現(xiàn)Comparable接口排序,升序、降序、倒敘,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論