部署新的 war 后,Flyway 数据库会自动迁移到 运行
Flyway database migration to run automatically when new war deployed
每当我向我的服务器部署新的 war 时,我都希望 Flyway 能够 运行。
部署服务器时,flyway 会自动获得 运行 吗?我是否必须始终自动执行一个脚本,然后执行 flyway 迁移命令?或者最好的方法是什么?
服务器:
服务器是连接到 MySQL 数据库的 Java Tomcat 服务器 运行ing 在 Elastic Beanstalk (AWS) 上。
部署过程
我们 运行 我们的 sql 数据库手动迁移脚本。然后我们将服务器的新 war 上传到 Elastic Beanstalk。
正如评论所说,可能有多种方法可以做到这一点。
ServletContextListener
一种常见的方法是使用Java Servlet spec for being notified when your web app is launching and shutting-down. That hook is the ServletContextListener
接口定义的钩子。在您的项目中添加一个 class 以实现此接口中的两种方法,一种用于启动,一种用于关闭。在启动方法中,运行 你的 Flyway 代码。
“上下文”一词是指您的网络应用程序的技术术语。
contextInitialized
您的网络应用正在启动。尚未处理传入的 Web 请求,并且在您完成此方法的实现之前不会处理。 运行 你的 Flyway 迁移在这里。
contextDestroyed
您的网络应用程序正在关闭。已处理最后剩余的 Web 请求,不再接受更多请求。
用 @WebListener
is the easiest of multiple ways to get your Servlet container 注释此 class 以注册一个实例。
很简单。
您的 ServletContextListener
保证在您的网络应用程序中首次执行任何 Servlet(或过滤器)之前被调用并 运行 完成。因此,这是在您的 servlet 开始工作之前完成您希望完成的设置工作的理想场所。 Flyway 似乎很适合我。
在 Stack Overflow 中搜索“ServletContextListener”以了解更多信息并查看示例,例如 。
处理失败
请注意,在出现问题时(当您的 ServletContextListener 遇到异常时)停止 Web 应用程序的部署在 Servlet 规范中没有明确定义。
一个例子可能是您的 Flyway 迁移由于某种原因失败,例如无法连接到数据库。此时您可能想要停止部署您的 Web 应用程序。
查看我自己的 以及我在该答案中列出的一组相关问题。 Tomcat 8.0.33 停止部署,并取消部署网络应用程序,但不幸的是没有报告有问题的异常(或者至少我在日志和 IDE 中找不到任何此类报告在开发模式下使用控制台)。其他 Servlet 容器的行为可能会有所不同。
这很有用:
启动时自动迁移:https://flywaydb.org/documentation/api/
所以对于 Java,只需创建脚本(例如 V1__initial_schema.sql,...),将它们放在 /src/main/resources/db/migration/
然后:
Flyway flyway = new Flyway();
flyway.setDataSource(...);
flyway.migrate();
每当我向我的服务器部署新的 war 时,我都希望 Flyway 能够 运行。
部署服务器时,flyway 会自动获得 运行 吗?我是否必须始终自动执行一个脚本,然后执行 flyway 迁移命令?或者最好的方法是什么?
服务器:
服务器是连接到 MySQL 数据库的 Java Tomcat 服务器 运行ing 在 Elastic Beanstalk (AWS) 上。
部署过程
我们 运行 我们的 sql 数据库手动迁移脚本。然后我们将服务器的新 war 上传到 Elastic Beanstalk。
正如评论所说,可能有多种方法可以做到这一点。
ServletContextListener
一种常见的方法是使用Java Servlet spec for being notified when your web app is launching and shutting-down. That hook is the ServletContextListener
接口定义的钩子。在您的项目中添加一个 class 以实现此接口中的两种方法,一种用于启动,一种用于关闭。在启动方法中,运行 你的 Flyway 代码。
“上下文”一词是指您的网络应用程序的技术术语。
contextInitialized
您的网络应用正在启动。尚未处理传入的 Web 请求,并且在您完成此方法的实现之前不会处理。 运行 你的 Flyway 迁移在这里。contextDestroyed
您的网络应用程序正在关闭。已处理最后剩余的 Web 请求,不再接受更多请求。
用 @WebListener
is the easiest of multiple ways to get your Servlet container 注释此 class 以注册一个实例。
很简单。
您的 ServletContextListener
保证在您的网络应用程序中首次执行任何 Servlet(或过滤器)之前被调用并 运行 完成。因此,这是在您的 servlet 开始工作之前完成您希望完成的设置工作的理想场所。 Flyway 似乎很适合我。
在 Stack Overflow 中搜索“ServletContextListener”以了解更多信息并查看示例,例如
处理失败
请注意,在出现问题时(当您的 ServletContextListener 遇到异常时)停止 Web 应用程序的部署在 Servlet 规范中没有明确定义。
一个例子可能是您的 Flyway 迁移由于某种原因失败,例如无法连接到数据库。此时您可能想要停止部署您的 Web 应用程序。
查看我自己的
这很有用:
启动时自动迁移:https://flywaydb.org/documentation/api/
所以对于 Java,只需创建脚本(例如 V1__initial_schema.sql,...),将它们放在 /src/main/resources/db/migration/ 然后:
Flyway flyway = new Flyway();
flyway.setDataSource(...);
flyway.migrate();