每当我向服务器部署新战争时,我都希望Flyway能够运行。
部署服务器时,flyway会自动运行吗?我是否必须始终自动化一个脚本,然后是flyway migration命令?或者最好的方法是什么?
服务器:
服务器是在Elastic Beanstalk(AWS)上运行的Java Tomcat服务器,它连接到MySQL数据库。
部署流程
我们手动在数据库上运行sql迁移脚本。然后我们将服务器的新战争上传到Elastic Beanstalk。
答案 0 :(得分:3)
正如评论所说,可能有多种方法可以做到这一点。
ServletContextListener
一种常见的方法是使用Java Servlet spec定义的挂钩在您的网络应用启动和关闭时收到通知。该钩子是ServletContextListener
接口。在项目中添加一个类,在该接口中实现两个方法,一个用于启动,另一个用于关闭。在启动方法中,运行您的Flyway代码。
“上下文”一词是指您的网络应用程序的技术术语。
contextInitialized
contextDestroyed
使用@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();