Flyway 使用詳解

發(fā)布時間:2024-03-18
一、開發(fā)時管理數(shù)據(jù)庫遇到的問題:
現(xiàn)在開發(fā)一般都是團隊開發(fā),這樣就會出現(xiàn)項目同步的問題,代碼同步可以通過svn工具管理起來,那數(shù)據(jù)庫同步怎么辦呢?理想的情況下,在開發(fā)新項目的時候會首先把業(yè)務(wù)理清楚,把數(shù)據(jù)庫表設(shè)計好,然后將數(shù)據(jù)庫交給專門的人員維護,也就不存在數(shù)據(jù)庫同步的問題了。但實際情況呢?需求從項目開始到項目結(jié)束一直在變,很多公司就沒有專門的數(shù)據(jù)庫維護人員,數(shù)據(jù)庫大家都在操作,都在修改,如果團隊之間溝通及時還好,大家每次更新代碼后順便也更新一下數(shù)據(jù)庫,如果溝通不及時,呵呵(大家自行腦補)。。。這樣數(shù)據(jù)庫不同步的問題就凸顯出來了。
二、flyway 的簡單介紹:
1、概念:
flyway是獨立于數(shù)據(jù)庫的應(yīng)用、管理并跟蹤數(shù)據(jù)庫變更的數(shù)據(jù)庫版本管理工具。用通俗的話講,flyway可以像svn管理不同人的代碼那樣,管理不同人的sql腳本,從而做到數(shù)據(jù)庫同步。
2、支持的數(shù)據(jù)庫類型:
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腳本的命名規(guī)范:
v 版本號(版本號的數(shù)字間以"."或"_"分隔開) 雙下劃線(用來分隔版本號和描述) 文件描述 后綴名,例如:v2017.9.30__update.sql。
注:版本號不能相同!
4、flyway讀取sql腳本的默認位置:
項目的源文件夾下的db/migration目錄。
5、指令:
一共就6個基本指令:migrate、clean、info、validate、baseline、repair。
三、flyway 的優(yōu)勢:
1、不僅支持sql 腳本,還支持java 代碼直接操作數(shù)據(jù)庫(flyway-core-x.x.x.jar);
2、有maven 插件;
3、支持命令行;
4、與spring 框結(jié)合,很方便地實現(xiàn)應(yīng)用啟動時自動檢查并升級數(shù)據(jù)庫的功能。
四、flyway命令行工具的使用:
1、解壓下載flyway-commandlin 版本并解壓到本地,結(jié)構(gòu)圖如下:
<!-- 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文件放在下面。
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(); //設(shè)置加載數(shù)據(jù)庫的相關(guān)配置信息 flyway.setdatasource(datasource); //設(shè)置存放flyway metadata數(shù)據(jù)的表名,默認"schema_version",可不寫 flyway.settable("schma_version"); //設(shè)置flyway掃描sql升級腳本、java升級腳本的目錄路徑或包路徑,默認"db/migration",可不寫 flyway.setlocations("database/sqlite"); //設(shè)置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 定義中我們可以看到,我們?yōu)閒lywaymigration 這個bean 實例注入了一個數(shù)據(jù)源,flyway 的所有操作將針對這個數(shù)據(jù)源進行;同時我們通過init-method 屬性指定了spring 在實例化該bean 以后,主動執(zhí)行該bean 的migrate 方法,而該方法內(nèi)會執(zhí)行flyway 更新數(shù)據(jù)庫的操作。至此,我們達到了在應(yīng)用啟動時,spring 實例化上下文的時候,在spring 實例化flywaymigration 這個bean 的時候,自動執(zhí)行flyway 更新數(shù)據(jù)庫的操作。
5、處理flyway 更新數(shù)據(jù)庫和代碼邏輯操作數(shù)據(jù)庫時的沖突(自己目前沒遇到,網(wǎng)上找到的,先留著備不時之需):
如果flyway 還在更新數(shù)據(jù)庫,沒有完成更新操作之前,應(yīng)用程序的其他邏輯已經(jīng)開始使用數(shù)據(jù)庫進行其他操作了,會導(dǎo)致應(yīng)用程序產(chǎn)生很多bug ,甚至根本運行不起來。要解決這個問題,我們可以利用spring 的bean 依賴原理,讓關(guān)鍵的數(shù)據(jù)庫操作bean 依賴于flywaymigration 這個bean ,達到在flywaymigration 沒有實例化完成(數(shù)據(jù)庫更新操作完成)之前,不能進行任何其他數(shù)據(jù)庫相關(guān)操作。
<bean id="sessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean" depends-on="migrationsqlite"> <property name="datasource" ref="datasource" /> </bean>這樣,每次啟動項目時就會自動更新數(shù)據(jù)庫,不必在為數(shù)據(jù)庫不同步煩惱了。
推薦教程:《java教程》
上一個:硬盤工作原理,網(wǎng)吧的硬盤工作原理
下一個:巴蜀地區(qū)茶文化的歷史

茉莉花茶制作工藝之窨花
加裝機械硬盤檢測不到 注冊表,如何通過設(shè)置注冊表使得電腦不能檢測到硬盤
侵犯公民個人信息罪的犯罪構(gòu)成是什么?
筆記本電腦亮度調(diào)節(jié)無法使用(筆記本亮度無法調(diào)節(jié)是怎么回事)
iphone安卓手機模擬器(安卓手機ios模擬)
人在拘留所還沒判如何離婚
主機硬盤位置圖示圖片,電腦主機哪個是硬盤圖片
window10禁用u盤(windows10 禁用u盤)
什么才是產(chǎn)品新人最基礎(chǔ)的能力?
camille bauer
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos