#現在開發一般都是團隊開發,這樣就會出現專案同步的問題,程式碼同步可以透過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中文網其他相關文章!