gpt4 book ai didi

java - 带有 Spring Boot 和多个模式的 Liquibase,如何指定执行顺序

转载 作者:行者123 更新时间:2023-11-30 06:41:49 29 4
gpt4 key购买 nike

我们有一个数据迁移作业需要按顺序初始化模式 AB。我们通过定义多个 SpringLiquibase 来处理多个模式,每个模式一个,每个都有自己的数据源和自己的主变更集。 (请注意,通常在 Spring Boot 中您不需要定义 SpringLiquibase,因为它会检测单个数据源并使用该数据源为您自动配置 SpringLiquibase。)

执行顺序似乎有所不同,具体取决于作业是在 IDE 中本地运行,还是捆绑为单个 JAR Spring Boot 应用程序。

我们如何确保 liquibase 的两次执行按我们想要的顺序发生?

(为什么顺序很重要:A 包含一些表,而 B 包含引用 A 中的表的 View 。我们必须确保我们在尝试 create view B.some_view (...) as select ... from A.xyz 之前grant select on A.* to B,否则由于权限不足,创建 B 失败。)

最佳答案

经过摸索和深入研究源代码后,发现它非常简单。

SpringLiquibase 实现 InitializingBean 并在 InitializingBean.afterPropertiesSet() 方法中执行 Liquibase 更新。

Spring 在完成每个 bean 的初始化后,对每个 bean 逐一调用此方法。

因此,要强制执行特定顺序,您需要强制执行 bean 在 Spring 上下文中定义的顺序。最简单的方法是使用 @DependsOn 注释。

所以我们设置了类似的东西:

@Bean
public SpringLiquibase liquibaseA(
@Qualifier("dataSourceA") DataSource dataSource,
@Qualifier("liquibasePropertiesA") LiquibaseProperties liquibaseProperties
) {
return instantiateSpringLiquibase(dataSource, liquibaseProperties);
}

@Bean
@DependsOn("liquibaseA")
public SpringLiquibase liquibaseB(
@Qualifier("dataSourceB") DataSource dataSource,
@Qualifier("liquibasePropertiesB") LiquibaseProperties liquibaseProperties
) {
return instantiateSpringLiquibase(dataSource, liquibaseProperties);
}

private SpringLiquibase instantiateSpringLiquibase(DataSource dataSource, LiquibaseProperties liquibaseProperties) {
// set the datasource from dataSource and everything else from liquibaseProperties
}

关于java - 带有 Spring Boot 和多个模式的 Liquibase,如何指定执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635195/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com