Flyway数据库迁移在部署新战争时自动运行

时间:2016-05-11 07:51:33

标签: java mysql war database-migration flyway

每当我向服务器部署新战争时,我都希望Flyway能够运行。

部署服务器时,flyway会自动运行吗?我是否必须始终自动化一个脚本,然后是flyway migration命令?或者最好的方法是什么?

服务器

服务器是在Elastic Beanstalk(AWS)上运行的Java Tomcat服务器,它连接到MySQL数据库。

部署流程

我们手动在数据库上运行sql迁移脚本。然后我们将服务器的新战争上传到Elastic Beanstalk。

2 个答案:

答案 0 :(得分:3)

正如评论所说,可能有多种方法可以做到这一点。

ServletContextListener

一种常见的方法是使用Java Servlet spec定义的挂钩在您的网络应用启动和关闭时收到通知。该钩子是ServletContextListener接口。在项目中添加一个类,在该接口中实现两个方法,一个用于启动,另一个用于关闭。在启动方法中,运行您的Flyway代码。

“上下文”一词是指您的网络应用程序的技术术语。

  • contextInitialized
    您的网络应用程序正在启动。尚未处理传入的Web请求,并且在您完成此方法的实现之前不会处理。在此处运行您的Flyway迁移。
  • contextDestroyed
    您的网络应用正在关闭。最后剩余的Web请求已经过服务,不再接受。

使用@WebListener注释此类是让Servlet container注册实例的多种方法中最简单的方法。

非常简单。

保证在您的网络应用中首次执行任何Servlet(或过滤器)之前调用ServletContextListener并运行完成。因此,这是在servlet上班之前完成设置工作的理想场所。 Flyway对我来说似乎很自然。

搜索“ServletContextListener”的堆栈溢出以了解更多信息并查看示例,例如my own Question & Answer

处理失败

请注意,在出现问题时(当ServletContextListener遇到异常时)停止Web应用程序的部署在Servlet规范中没有明确定义。

示例可能是您的Flyway迁移由于某种原因失败,例如无法连接到数据库。此时,您可能希望暂停Web应用程序的部署。

查看我自己的Question and Answer以及我在该答案中列出的相关问题组。 Tomcat 8.0.33停止部署,并取消部署Web应用程序,但遗憾的是没有报告有问题的异常(或者至少在开发模式下我无法在日志中或IDE控制台中找到任何此类报告)。其他Servlet容器的行为可能会有所不同。

答案 1 :(得分:3)

这很有用:

启动时自动迁移:https://flywaydb.org/documentation/api/

所以对于Java来说,只需创建脚本(例如,V1__initial_schema.sql,...),将它们放在/ src / main / resources / db / migration /下 然后:

Flyway flyway = new Flyway();
flyway.setDataSource(...);
flyway.migrate();