不同数据源的不同迁移场景
Posted
技术标签:
【中文标题】不同数据源的不同迁移场景【英文标题】:Different migration scenarios for different datasources 【发布时间】:2021-11-02 22:18:32 【问题描述】:朋友们,如何使用Flyway配置多个数据库的迁移?在我的 Spring 应用程序中,我使用了 2 个数据库,第一个数据库(PostgreSQL)负责 Web,它存储用户、角色等数据,第二个数据库(mysql)负责业务逻辑。数据库位于不同的主机上,并且没有以任何方式相互连接。当然,我的数据源具有不同的数据结构。
我已经配置了两个数据源,分别是LocalDBConfig和JiraDBConfig。
@Configuration
@PropertySource( "classpath:application.properties" )
@EnableJpaRepositories(
basePackages = "net.komus.oksitreport.repo.local",
entityManagerFactoryRef = "localEntityManager",
transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig
@Primary
@Bean
@ConfigurationProperties( prefix = "spring.datasource" )
@FlywayDataSource
public DataSource customerDataSource()
return DataSourceBuilder.create().build();
@Bean(name = "localEntityManager")
@Primary
public LocalContainerEntityManagerFactoryBean localEntityManager()
...
@Bean
@Primary
public PlatformTransactionManager localTransactionManager()
...
@Configuration
@PropertySource( "classpath:application.properties" )
@EnableJpaRepositories(
basePackages = "net.komus.oksitreport.repo.jira",
entityManagerFactoryRef = "jiraEntityManager",
transactionManagerRef = "jiraTransactionManager"
)
public class JiraDBConfig
@Bean
@ConfigurationProperties( prefix = "db.jira.datasource" )
@FlywayDataSource
public DataSource jiraDataSource()
return DataSourceBuilder.create().build();
@Bean(name = "jiraEntityManager")
public LocalContainerEntityManagerFactoryBean jiraEntityManager()
...
@Bean
public PlatformTransactionManager jiraTransactionManager()
...
我已经按路径排列了迁移文件:
db/migrate/manager
路径应负责本地数据库配置迁移,db/migrate/jira
路径应负责 JiraDBConfig 迁移。
我不明白如何配置我需要的功能。
【问题讨论】:
【参考方案1】:我想你快到了。据我所知,没有开箱即用的方式让 flyway 同时处理两个数据库迁移。话虽如此,有一种方法可以通过一些手动配置来做到这一点。因此,根据您的要求考虑以下示例:
@Configuration
public class PostgresDbConfiguration
@Primary
@Bean(name = "postgresDatasource")
@ConfigurationProperties(prefix = "primary.datasource")
@FlywayDataSource
public DataSource dataSource()
return DataSourceBuilder.create().build();
和
@Configuration
public class MariaDbConfiguration
@Bean(name = "mariaDatasource")
@ConfigurationProperties(prefix = "secondary.datasource")
public DataSource dataSource()
return DataSourceBuilder.create().build();
对于我们的用例,这将是我们将要迁移的两个数据库(以及后续数据源)。如您所见,我的postgresDatasource
被标记为@Primary
。
对于主数据源,我们将让 Flyway 做自己的事情,因此需要进行的唯一配置如下:
spring.flyway.locations=classpath:db/migration/postgresql
对于辅助数据源 (mariaDatasource
),您需要做的是创建一个 Flyway bean,它将手动迁移数据库。例如考虑以下内容:
@Configuration
public class FlywayConfig
private final DataSource mariaDatasource;
public FlywayConfig(@Qualifier("mariaDatasource") DataSource mariaDatasource)
this.mariaDatasource = mariaDatasource;
@PostConstruct
public void runMigration()
Flyway.configure()
.dataSource(mariaDatasource)
.locations("db/migration/mariadb")
.baselineOnMigrate(true)
.load()
.migrate();
如您所见,这个类被注入辅助数据源,用于手动创建Flyway
对象。然后它使用相关对象手动执行迁移。
【讨论】:
@akotex,谢谢,你的例子帮我解决了问题 如果对您有帮助请点赞 @akotex,我真的很想这样做,但我的名声仍然很小:-)以上是关于不同数据源的不同迁移场景的主要内容,如果未能解决你的问题,请参考以下文章