首頁  >  文章  >  Java  >  Flyway 使用詳解

Flyway 使用詳解

Guanhui
Guanhui轉載
2020-07-28 18:31:383722瀏覽

Flyway 使用詳解

#現在開發一般都是團隊開發,這樣就會出現專案同步的問題,程式碼同步可以透過SVN工具管理起來,那資料庫同步怎麼辦呢?理想的情況下,在開發新專案的時候會先把業務理清楚,把資料庫表設計好,然後將資料庫交給專門的人員維護,也就不存在資料庫同步的問題了。但實際情況呢?需求從專案開始到專案結束一直在變,很多公司就沒有專門的資料庫維護人員,資料庫大家都在操作,都在修改,如果團隊之間溝通及時還好,大家每次更新程式碼後順便也更新一下資料庫,如果溝通不及時,呵呵(大家自行腦補)。 。 。這樣資料庫不同步的問題就凸顯出來了。

二、Flyway 的簡單介紹:

1、概念:

Flyway是獨立於資料庫的應用、管理並追蹤資料庫變更的資料庫版本管理工具。用通俗的話講,Flyway可以像SVN管理不同人的程式碼一樣,管理不同人的sql腳本,從而做到資料庫同步。 2、支援的資料庫類型:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。

3、sql腳本的命名規範:

V 版本號(版本號的數字間以"."或"_"分隔開) 雙底線(用來分隔版本號和描述) 檔案描述後綴名,例如:V2017.9.30__Update.sql。

註:版本號碼不能相同!

4、Flyway讀取sql腳本的預設位置:

專案的來源資料夾下的db/migration目錄。 5、指令:總共就6個基本指令:migrate、clean、info、validate、baseline、repair。

三、Flyway 的優點:

1、不只支援sql 腳本,也支援Java 程式碼直接操作資料庫(flyway-core-x.x.x. jar);

2、有Maven 外掛;

3、支援命令列;

4、與Spring 框結合,很方便地實現應用程式啟動時自動檢查並升級資料庫的功能。

四、Flyway命令列工具的使用:

1、解壓縮下載flyway-commandlin 版本並解壓縮到本地,結構圖如下:

  

  2、將sql腳本放在Flyway預設的db/migration目錄下,如果放在其他位置需要修改conf/flyway.conf檔案中的flyway.locations。

3、依照自己的狀況修改conf/flyway.conf檔案中的flyway.url、flyway.user、flyway.password。

4、在命令列執行migrate指令。

五、與Maven專案結合使用:

######1、引入依賴座標:###
<!-- flyway -->
 <dependency>
 <groupId>org.flywaydb</groupId>
 <artifactId>flyway-core</artifactId>
 <version>4.2.0</version>
 <dependency>
###2、在src/main/resources目錄下建立存放sql版本檔案的路徑dataBase/sqlite(也可以寫預設路徑db/migration),並將sql檔案放在下面。 ###############3、增加flyway的java類別:###
package com.xxxxxx.flyway;
 
 import javax.sql.DataSource;
 import org.flywaydb.core.Flyway;
 
 public class MigrationSqlite {
 
 private DataSource dataSource;
 
 public void setDataSource(DataSource dataSource) {
 this.dataSource = dataSource;
 }
 
 public void migrate() {
 //初始化flyway类
 Flyway flyway = new Flyway();
 //设置加载数据库的相关配置信息
 flyway.setDataSource(dataSource);
 //设置存放flyway metadata数据的表名,默认"schema_version",可不写
 flyway.setTable("SCHMA_VERSION");
 //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径,默认"db/migration",可不写
 flyway.setLocations("dataBase/sqlite");
 //设置sql脚本文件的编码,默认"UTF-8",可不写
 flyway.setEncoding("UTF-8");
 
 flyway.migrate();
 }
 }
###4、在spring中實例化第3步的java類別:###
<bean id="MigrationSqlite" class="com.xxxxxx.flyway.MigrationSqlite" init-method="migrate">
 <property name="dataSource" ref="dataSource"></property>
 </bean>
## #從上面的bean 定義中我們可以看到,我們為flywayMigration 這個bean 實例注入了一個資料來源,Flyway 的所有操作將針對這個資料來源進行;同時我們透過init-method 屬性指定了Spring 在實例化該bean以後,主動執行該bean 的migrate 方法,而該方法內會執行Flyway 更新資料庫的操作。至此,我們達到了在應用程式啟動時,Spring 實例化上下文的時候,在Spring 實例化flywayMigration 這個bean 的時候,自動執行Flyway 更新資料庫的操作。 ######5、處理Flyway 更新資料庫和程式碼邏輯作業資料庫時的衝突(自己目前沒遇到,網路上找到的,先留著備不時之需):######如果Flyway 還在更新資料庫,沒有完成更新操作之前,應用程式的其他邏輯已經開始使用資料庫進行其他操作了,會導致應用程式產生許多bug ,甚至根本運作不起來。要解決這個問題,我們可以利用Spring 的bean 依賴原理,讓關鍵的資料庫操作bean 依賴flywayMigration 這個bean ,達到在flywayMigration 沒有實例化完成(資料庫更新作業完成)之前,不能進行任何其他資料庫相關操作。 ###
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="MigrationSqlite">
 <property name="dataSource" ref="dataSource" />
 </bean>
###這樣,每次啟動專案時就會自動更新資料庫,不必在為資料庫不同步煩惱了。 ###

推薦教學:《Java教學

以上是Flyway 使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除