Springboot集成flywaydb支持多數據源


flyway是一個數據庫版本管理工具,集成進springboot后,每次系統升級啟動時自動執行sql語句升級數據庫,避免手動操作數據庫。

1.maven引入依賴

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

2.application.properties文件增加配置

## 開啟,默認開啟
flyway.enabled=true
## sql 腳本的位置,默認為 classpath:db/migration。可手動指定
flyway.locations=classpath:db/sqlVersion
## 指定數據源,如果沒有指定的話,將使用配置的主數據源
flyway.url=jdbc:mysql://10.0.192.10:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8
flyway.user=repl
flyway.password=root
flyway.check-location=true
# 如果數據庫不是空表,需要設置成 true,否則啟動報錯
flyway.baseline-on-migrate=true

#默認初始版本號為1

flyway.baseline-version=0

3.指定flyway.locations目錄下創建sql腳本

命名規則:源碼默認初始版本號為V1,sql腳本版本號需大於1, sql腳本命名 :V版本號__名稱.sql,

注:版本號后面為兩條下划線,后續腳本版本號需大於當前最大版本號;

 

 

springboot啟動時,加載flyway組件,執行sql腳本。

首次使用flyway,springboot啟動時,會自動創建schema_version表,維護歷史sql版本變更信息。

sql腳本執行順序為:按版本號從小到大;

歷史sql腳本一旦隨springboot啟動升級,無論腳本執行成功還是失敗,后續開發不能再做修改,否則,springboot啟動時由於校驗到腳本文件有變更而導致報錯,無法啟動成功。

若同時升級多個版本,中間某個版本的腳本執行失敗,則執行失敗的腳本內操作會回滾,同時,后面的版本不會執行,而且springboot啟動失敗。

若腳本執行失敗,需要及時處理解決,以下兩種解決方式:

1:刪除失敗的版本記錄,修改腳本,重新打包部署;

2:更新失敗的版本信息字段 success為“1”即成功,新增正確的sql腳本,並賦值新的版本號,然后重新啟動springboot, 啟動時會忽略失敗的版本,繼續執行后面的版本;

schema_version表:

4.flyway 多數據源配置

  若同一個項目中有多個數據源需要進行版本管理,則需要放棄application.properties中的配置,

  並且配置flyway.enabled=false,禁止springboot自動的調用flyway.migrate()方法。然后增加配置類,手動調用migrate()方法即可。

 1 package cn.demo.test.config;
 2 
 3 import javax.annotation.PostConstruct;
 4 import javax.annotation.Resource;
 5 import javax.sql.DataSource;
 6 
 7 import org.flywaydb.core.Flyway;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.context.annotation.Configuration;
10 
11 @Configuration
12 public class FlywayDbInitializer {
13 
14     @Resource
15     private DataSource dataSource;//系統中已經注入的數據源
16 
17     @Resource
18     private DataSource dmDataSource;//多個數據源
19 
20     @PostConstruct
21     public void migrateFlyway() {
22 
23         Flyway alertFlyway = new Flyway();
24         alertFlyway.setBaselineOnMigrate(true);
25         alertFlyway.setDataSource(dataSource);
26         alertFlyway.setSchemas("alert");
27         alertFlyway.setLocations("db/alertVersion");
28         alertFlyway.setValidateOnMigrate(false);//是否校驗checksum值
29         alertFlyway.setIgnoreFailedFutureMigration(false);
30         //        alertFlyway.setBaselineVersionAsString("1.1");//基准版本,<=1.1不會執行。
31         alertFlyway.migrate();
32         Flyway dmFlyway = new Flyway();
33         dmFlyway.setDataSource(dmDataSource);
34         dmFlyway.setBaselineOnMigrate(true);
35         dmFlyway.setSchemas("data_devops");
36         dmFlyway.setLocations("db/dataDevopsVersion");
37         dmFlyway.migrate();
38     }
39 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM