【问题标题】:Flyway Init Order飞路初始化顺序
【发布时间】:2021-04-29 17:04:24
【问题描述】:

我有一个 Java Spring Boot 应用程序,在我的 Maven pom.xml 中将 Flyway 配置为依赖项(我有一个父 pom 和一个项目 pom...Flyway 在我的项目 pom 中定义)。

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

只有 application.properties 中的几个条目:

flyway.enabled=true
flyway.out-of-order=true

我可以运行一个 maven 任务来让 Flyway 运行 migrate 来创建/更新我的数据库,然后针对它运行我的应用程序,但是我无法让它在正确的时间调用 migrate运行我的应用程序(这在产品中显然很重要)。看起来我的所有 Spring 类都首先被实例化,其中一些涉及查看数据库,然后发生 Flyway 迁移,因此例如,如果您针对空数据库运行应用程序,则应用程序在尝试访问任何内容时崩溃数据库。

关于在我的 Spring Boot 应用程序启动过程中如何让 Flyway 更早地进行迁移的任何提示?

【问题讨论】:

  • 在你的父 pom 中,是否存在 Flyway 依赖项。我们使用 gradle,flyway 出现在顶部。
  • 为了清楚起见,我已经在我的项目 pom 中定义了它,而不是我的父 pom,但是对于你的问题,虽然它首先列出,但我没有指出任何特定的依赖关系。也许我应该研究一下 - 否则我也可能必须直接在代码中将其声明为已配置的 Bean 并在那里指出依赖关系。但无论哪种方式,我都不确定在 Flyway 上直接指示什么依赖项,因为依赖项指示必须在 before 配置什么。因此,也许我必须将 Flyway 指示为对当前早期加载的其他内容的依赖。

标签: java spring-boot flyway


【解决方案1】:

我不确定您的数据源配置是什么样的,但您可以声明您的 JPA 配置,使其依赖于 flyway 迁移。

您可以在任何 @Config 类或数据源 bean 上声明 @DependsOn("flyway") 注释,“flyway”是您的 flyway 配置 bean 的声明名称。然后,在您的 flyway 配置 bean 上,使用如下所示的 initMethod 属性限定 bean 注释:@Bean(initMethod = "migrate")

【讨论】:

    【解决方案2】:

    尝试更改“flyway.out-of-order=false”

    【讨论】:

      【解决方案3】:

      我建议您尝试使用 ApplicationStartedEvent 等事件侦听器。

       @EventListener
        public void migrate(ApplicationStartedEvent applicationStartedEvent) {
                 //do some checks
                 flyway.migrate();
        }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 2012-02-16
        • 2021-07-12
        • 2011-03-06
        相关资源
        最近更新 更多