zoukankan      html  css  js  c++  java
  • flyway的使用

    1、使用它之前先要了解一些概念:

    版本:对数据库的每一次变更可称为一个版本。

    迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移。

    可用的迁移:Flyway的文件系统识别出来的迁移版本。

    已经应用的迁移:Flyway已经对数据库执行过的迁移。

    2、flyway最基本的几个命令。

    Migrate:应用所有的迁移到最新版本,它会在你的DB中新建个表schema_version来存放每次升级的版本信息。

    Clean:clean all objects

    Info:打印所有的迁移的信息以及状态。

    Validate:迁移之前进行验证。

    Baseline:初始化schema_version表,并插入一条原始verion=1。

    Repair:它主要做了两件事,移除所有失败的迁移(升级),重置校验和。

    3、既支持sql方式升级也支持java方式升级

         1、持SQL(还有PL/SQL,T-SQL)文件的方式进行升级(这就是最原始的方式,但是得按照一定的规则规则,例如: V1_0_1__create.sql。

    sql脚本的命名规则:

    prefix: default:V (大写) 

    version: 版本号也可以使用大小版本组合的方式,小版本号用单 _区分  

    separator: 分隔符,双下划线 __  

    description: 描述(必须要有意义)  

    suffix: 后缀 default:  .sql

         2、当然也支持Java方式,继承 JdbcMigration即可。

    4、可以使用命令行客户端command-lineclient来执行命令来升级数据库的版本。这个在这就不介绍了,以后会拓展。重点在介绍java的使用。

    5、当然flyway也提供了插件支持.

    有如下插件支持:Maven, Gradle,SBT和Ant,还有更多Plugins,提供对Spring Boot, Dropwizard, Grails, Play,Griffon, Grunt, Ninja 的支持。其中可以研究下flyway-test-extensions,有Usage flyway dbunit test、Usage-flyway-spring-test 功能很强大。

    6、在maven项目里面的spring mvc里面使用flyway在系统启动的时候去检查并升级数据库的版本。

    6.1、引入flyway的jar包,在pom.xml里面内容如下:

    <!-- flyway依赖 -->

            <dependency>

              <groupId>org.flywaydb</groupId>

              <artifactId>flyway-core</artifactId>

              <version>3.0</version>

          </dependency>

    6.2、编写数据库的版本的脚本文件,放到src/main/resources的flyway里面:

    (flyway找脚本的时候默认去src/mian/resources下面的db/migration,如果要放

    在别的位置,后面的地方要配置一下)


    6.3、定义在应用启动时自动运行Flyway的Java 类,并实现其逻辑代码

    package com.ibm.flyway;

    importjavax.sql.DataSource;

    importorg.flywaydb.core.Flyway;

    import org.flywaydb.core.api.FlywayException;

    public classFlywayMigration {

        private DataSource dataSource; 

        public void setDataSource(DataSourcedataSource) { 

            this.dataSource = dataSource; 

        } 

        public void migrate() { 

            Flyway flyway = new Flyway(); 

            flyway.setDataSource(dataSource);

           flyway.setLocations("db/migration"); // 设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径(表示是src/main/resources/flyway下面,前缀默认为src/main/resources,因为这个路径默认在classpath下面)

           flyway.setEncoding("UTF-8");  // 设置sql脚本文件的编码

            flyway.setOutOfOrder(true);

            //flyway.setDataSource(dataSource); 

           //flyway.setSchemas("flywaydemo"); // 设置接受flyway进行版本管理的多个数据库 

            //flyway.setTable("schema_version"); // 设置存放flyway metadata数据的表名 

           //flyway.setValidationMode(ValidationMode.ALL); // 设置执行migrate操作之前的validation行为 

           //flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 设置当validation失败时的系统行为 

            // 设置当validation失败时的系统行为

        try {

            flyway.setInitOnMigrate(true);

            flyway.migrate();

         } catch (FlywayException e) {

            flyway.repair();

            e.printStackTrace();

         }

        } 

    }

    6.4、设置在系统启动是自动运行FlywayMigration类的migrate方法

    在ApplicationContext.xml(spring mvc的上下文中加入如下:)

    <!-- flayway-->

    <beanid="flywayMigration1" class="com.ibm.flyway.FlywayMigration" init-method="migrate">

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

    </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>

    至此,运行就可以了。

    但是值得注意的是:

     在启动的tomcat的时候,内容如下:

    但是在schema_version里面已经执行过的版本号如下:

    如果存在V1_0_0__create.sql这个脚本时,是不会执行这个的,而是会执行V1_0_1__create.sql,因为schema_version表的version为1其实被flyway默认为v1_0_0_0版本了,所以没有执行。原因是schema_version表的version为1其实被flyway默认为v1_0_0版本了,所以没有执行,而version版本为表示初始化schema_version。也就是说版本号只要不一样就会执行。

    注意:sql脚本的命名规则一定要准确,按照格式去命名。

  • 相关阅读:
    What is the purpose of FormsAuthenticationTicket isPersistent property?
    Forms Authentication configurations
    What is the difference between localStorage, sessionStorage, session and cookies?
    Set-Cookie
    申威机器信息
    systemctl 关闭图形界面的办法
    sourcetree 使用
    在 Web 项目中应用 Apache Shiro
    移动web开发框架
    从0开始搭建symphony
  • 原文地址:https://www.cnblogs.com/zhusf/p/10469666.html
Copyright © 2011-2022 走看看