Flyway數據庫版本控制


前言:最近工作上遇到個問題,項目開發過程中,開發代碼可以通過svn來版本控制,但數據庫又該如何來管理呢?多個人接觸數據庫,當對表、字段或數據修改后,又怎么來同步呢?經過苦尋,發現了個叫flyway的開源項目:http://flywaydb.org/,java編寫,官方的介紹就是我的初衷,豈能不心動?

 

官網是英文的,查了下居然沒有中文文檔,難道沒有中國人用?

 

慢慢看了下官方文檔,試着做了下,一次成功!(離開電腦,蹦達幾下,繼續坐回電腦)

 

自己寫個小教程吧

 

1、將flyway-core-2.3.jar放到項目lib中,下載地址:http://flywaydb.org/getstarted/download.html

 

2、在src目錄下建立保存sql版本文件的路徑:src/db/migration,flyway默認查找路徑,可以改,但沒必要。


 
  

 

3、在sql版本文件路徑中增加sql文件,命名規則,如:V1__2014_4_13.sql ,V開頭+版本號+雙下划線+描述,描述中可以有下划線,后綴為sql。別問能不能修改這個規則,否則,我咬你。

 

4、增加flyway的java類,有命令行工具,但還是java類用起來方便,如下:

package com.cms.flyway;

import java.io.IOException;
import java.util.Properties;

import com.googlecode.flyway.core.Flyway;

public class FlywayApp {
    
    // 讀取數據庫配置參數
    private static Properties config = new Properties();
    static {
        try {
            config.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("activerecord.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    // 執行數據庫版本升級
    public static void migration() {
        // Create the Flyway instance
        Flyway flyway = new Flyway();
        
        // Point it to the database
        flyway.setDataSource(config.getProperty("com.et.ar.ActiveRecordBase.url"), config.getProperty("com.et.ar.ActiveRecordBase.username"), config.getProperty("com.et.ar.ActiveRecordBase.password"));
        flyway.setInitOnMigrate(true);
        
        // Start the migration
        flyway.migrate();
    }
}
<!-- 數據庫自動更新 -->
    <bean id="baselineVersion" class="org.flywaydb.core.api.MigrationVersion">
        <constructor-arg value="2.5"/>
    </bean>
    <bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
        <property name="dataSource" ref="dataSource"/>
        <property name="baselineOnMigrate" value="true" />
        <property name="baselineVersion" ref="baselineVersion" />
        <property name="outOfOrder" value="true" />
    </bean>

    <!--整合hibernate-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="flyway" >
         <!--方案一:Druid數據源配置-->
         <property name="dataSource" ref="dataSource"></property> 
         <!--方案二:數據源配置--> 
        <!--<property name="dataSource" ref="myP6DataSource"></property>-->
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=${jdbc.hibernate.dialect}
                hibernate.show_sql=${jdbc.hibernate.show_sql}
                hibernate.format_sql=${jdbc.hibernate.format_sql}
                hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
                hibernate.id.new_generator_mappings=true
              
                <!-- 配置hibernate的二級緩存 -->
                hibernate.cache.use_query_cache=true
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
            </value>
        </property>
        <property name="packagesToScan">
            <value>com.founder.mrp.domain</value>
        </property>
    </bean>

從上面的bean 定義中我們可以看到,我們為flywayMigration 這個bean 實例注入了一個數據源,Flyway 的所有操作將針對這個數據源進行;同時我們通過init-method 屬性指定了Spring 在實例化該bean 以后,主動執行該bean 的migrate 方法,而該方法內會執行Flyway 更新數據庫的操作。至此,我們達到了在應用啟動時,Spring 實例化上下文的時候,在Spring 實例化flywayMigration 這個bean 的時候,自動執行Flyway 更新數據庫的操作。

但是,我們還沒有達到目的,萬一Flyway 還在更新數據庫,沒有完成更新操作之前,應用程序的其他邏輯已經開始使用數據庫進行其他操作了,會導致應用程序產生很多bug ,甚至根本運行不起來。

要解決這個問題,我們可以利用Spring 的bean 依賴原理,讓關鍵的數據庫操作bean 依賴於flywayMigration 這個bean ,達到在flywayMigration 沒有實例化完成(數據庫更新操作完成)之前,不能進行任何其他數據庫相關操作。

利用Spring 的bean 依賴讓flywayMigration 優先處理數據庫更新操作:

<!-- 將連接池注入到 JdbcTemplate對象 -->

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"depends-on="flywayMigration1">

    <property name="dataSource"ref="dataSource"></property>

</bean>

至此,運行就可以了。

  

5、在服務器啟動的時候或者定時器 執行該類的migration()方法即可。

 

6、第一次執行會生成一個專門存放數據庫schema_version的表



 

7、以后數據庫有了新的改動,導出新版本sql文件(如:mysqldump -u -p databasename>/xx.sql)改為新版本命名文件放到db.migration路徑下,flyway會自動幫你更新數據庫版本的。

 

over!

轉自:https://www.cnblogs.com/qq739178184/p/5119111.html


免責聲明!

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



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