在许多生产环境中由许多客户机部署的产品上工作。它至少包含一个Spring Boot应用程序。
我们已经将flyway用于db模式迁移。从Spring Boot 1.5.x升级到2.0.x使我们的flyway版本从3.x升级到5.x。
Spring Boot迁移指南只是说在引导升级之前升级到Flyway4。然而,这将要求我们的所有客户在能够升级到最新版本之前进行中间升级。
那么,问题来了:你会如何从flyway 3直接升级到flyway 5呢?
以防我不是这个星球上最后一个从3升到5的人。
问题:
我希望升级对项目上的其他开发人员是透明的,并且在对活动应用程序进行升级时不需要任何特殊的部署说明,所以我做了以下操作。
Flyway bean created -> Flyway migrate called -> LocalContainerEntityManager created
解决方案:
我将引导的顺序更改为:
Flyway bean created -> Flyway3To4Migrator -> LocalContainerEntityManager created
Flyway3To4Migrator将在需要时执行schema_table更改,如果发生升级,则运行修复,然后始终运行flyway.migrate以继续迁移。
@Configuration
public class AppConfiguration {
@Bean
// Previously: @DependsOn("flyway")
@DependsOn("flyway3To4Migrator")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
...
}
// Previously: @Bean(initMethod = "migrate")
@Bean
public Flyway flyway(DataSource dataSource) {
...
}
}
@Component
@DependsOn("flyway")
public class Flyway3To4Migrator {
private final Log logger = LogFactory.getLog(getClass());
private Flyway flyway;
@Autowired
public Flyway3To4Migrator(Flyway flyway) {
this.flyway = flyway;
}
@PostConstruct
public void migrate() throws SQLException, MetaDataAccessException {
DataSource dataSource = flyway.getDataSource();
boolean versionRankColumnExists = checkColumnExists(dataSource);
if (versionRankColumnExists) {
logger.info("Upgrading metadata table to the Flyway 4.0 format ...");
Resource resource = new ClassPathResource("upgradeMetaDataTable.sql", getClass().getClassLoader());
ScriptUtils.executeSqlScript(dataSource.getConnection(), resource);
logger.info("Metadata table successfully upgraded to the Flyway 4.0 format.");
logger.info("Running flyway:repair for Flyway upgrade.");
flyway.repair();
logger.info("Complete flyway:repair.");
}
logger.info("Continuing with normal Flyway migration.");
flyway.migrate();
}
private boolean checkColumnExists(DataSource dataSource) throws MetaDataAccessException {
return (Boolean) JdbcUtils.extractDatabaseMetaData(
dataSource, dbmd -> {
ResultSet rs = dbmd.getColumns(
null, null,
"schema_version",
"version_rank");
return rs.next();
});
}
}
需要注意的几件事:
我把Spring靴和飞道一起用。我将FlyWay依赖项添加到我的Gradle构建文件中,如下所示: 我还添加了带有初始迁移文件的文件夹。迁移按预期进行。但现在我想使用任务进行清理。但是,当我运行这个时,我得到一个错误,说任务找不到。我用Spring靴还有别的办法吗?
我正在制作一个音乐播放器来处理学校的作业。飞利浦色调灯将产生一些相应的视觉效果。我想让每首歌的视觉效果都与众不同。因此,我获取了播放曲目的封面艺术(使用LastFM API)以获得最常用的颜色,并将其用作创建其他颜色的基础。飞利浦色调有一种不同的显示颜色的方式,即HSB。所以我通过
PS Vita的系统软件可通过升级,追加各式各样的功能或强化安全性。使用时请随时升级为最新版本。 若要进行系统升级,需事先将连接的电脑设为以下状态。 连接互联网 安装/下载PlayStation®内容管理助手 可在以下网站进行下载。 http://cma.dl.playstation.net/cma/ 1. 在电脑确认内容管理助手是否已启动。 可从电脑的工作列确认。 2. 使用USB连接线连接PS
PS Vita的系统软件可通过升级,追加各式各样的功能或强化安全性。使用时请随时升级为最新版本。 若要进行升级,需事先将连接的PS3™设为以下状态。 连接互联网 系统软件升级为版本4.00以上 关闭所有使用中的应用程序,显示(用户) 1. 使用USB连接线连接PS Vita和PS3™。 2. 操作PS Vita,轻触[系统升级]>[连接至PS3™进行升级]。 可通过PS3™的网络功能,经由互联网下
只需将Flyway集成到我们的应用程序中,它在以下情况下效果很好: > 全新的应用程序安装与空架构,创建schema_version表并执行完整的架构脚本,之后应用程序正在其路上。工作很棒! 有一个补丁sql脚本,我们设置的版本高于当前版本,补丁get自动应用,版本递增,这里没有问题! 现在问题是这样的:我们有旧版本的应用程序。假设我们当前的应用程序版本是7.5(模式版本1.0),当用户使用7.4
我们有许多项目在许多服务器上运行,查找一个数据库,我们正在考虑为每个项目设置Flyway以控制我们的数据库结构。 但是,如果某些项目同时重新部署,我们担心并发迁移问题。(顺便说一句,我们总是在sql语法中照顾“如果存在”的事情) Flyway如何在同一数据表或其他结构发生并发更改时工作?