Flyway、Spring Boot 和应用程序在没有数据库的情况下启动

Posted

技术标签:

【中文标题】Flyway、Spring Boot 和应用程序在没有数据库的情况下启动【英文标题】:Flyway, spring boot and application start without database 【发布时间】:2019-11-04 06:10:16 【问题描述】:

我正在尝试使用 Flyway(和 Hikari 池)制作 Spring Boot 应用程序以启动服务器,即使当时数据库不可用。

我需要支持以下情况: 1.应用启动时DB不可用(DB启动后需要运行Flyway,最长可达30分钟)。 2. DB在应用生命周期内下线,然后再重新上线。

我在第一种情况下遇到了问题,即使数据库不可用且应用程序停止,Flyway 也总是尝试进行迁移。 我尝试添加 spring.datasource.continue-on-error: true 但 Flyway 忽略了这一点,并且我找不到任何允许此类操作的 flyway 配置。

有可能还是我应该把 Flyway 包起来自己做?

春季启动 2.1.4

【问题讨论】:

当你启动一个 Spring Boot 应用程序时,它会创建一个数据库连接。如果数据库不可用,这已经失败。如果数据库不可用,则应用程序毫无意义。我有两个问题:1. 为什么启动应用程序时数据库不可用 2. 当您无法进行初始连接时,如何注意到数据库已启动 【参考方案1】:

需要考虑的几点 当 java 应用程序的实例确实不可用时,应用程序的期望行为是什么?好的,所以 flyway 不会启动,但是应用程序将如何处理必须到达数据库的请求? Flyway 本身依赖于 DataSource bean,如果你使用它可能依赖于 hibernate,这些基础设施比 flyway 本身复杂得多?

也许如果数据库不可用,应用程序根本不需要启动? 相反,值得依赖编排器(如 kubernetes、ECS 或任何能够识别应用程序未启动并会尝试重新触发启动的任何东西,一次又一次,直到数据库准备好)?

这是我的总体建议。

现在,假设找到所有这些问题的答案,并且仍然想要继续这条路:

在 Flyway 集成方面,Spring Boot 本身的工作方式如下:

如果相关类(Flyway 类)存在于 classpath 和 spring.flyway.enabled=true 上,那么 flyway 的 bean 就会启动,spring boot 会发挥它的魔力。

技术上相关的自动配置可以在org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration类(org.springframework.boot:spring-boot-autoconfigure模块)中找到

我认为要走的路是禁用 flyway,并且考虑到像 DataSource 这样的 bean 是可用的(不知何故) - 自己创建一个 Flyway Bean 并在后台以某种循环触发迁移,该循环只会退出如果迁移确实成功(或已经应用)

【讨论】:

以上是关于Flyway、Spring Boot 和应用程序在没有数据库的情况下启动的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flyway 和 Spring Boot 在 docker testcontainers 环境中迁移模式

Flyway 在 Spring Boot 上不工作时如何调试?

使用 Flyway 和 Spring Boot 迁移基线

Flyway 和 Spring Boot 集成

Spring Boot 应用程序在启动时未运行 Flyway 迁移

Spring-Boot 不适用于 Flyway