使用R2DBC进行数据库迁移

时间:2019-07-24 12:38:57

标签: java database-migration liquibase flyway r2dbc

我是R2DBC(https://r2dbc.io/)的新手。我想知道r2dbc的生态系统是否具有数据库迁移工具/框架。

似乎Liquibase和Flyway依赖JDBC。是否有计划允许那些框架支持r2dbc驱动程序?

欢迎任何输入或反馈。

6 个答案:

答案 0 :(得分:3)

在我看来(从R2DBC网站首页的粗略浏览看)R2DBC的目标确实与迁移没有任何关系。该页面列出的主要功能如下:

  • 反应性流-R2DBC基于反应性流提供了完全反应性的非阻塞API。
  • 关系数据库-R2DBC使SQL数据库与反应式API结合使用,这是JDBC的阻塞性质所无法实现的。
  • 可扩展的解决方案-反应流使从传统的每个连接一个线程的方法转变为更强大,更可扩展的方法。

这里没有什么东西可以保证向像Liquibase这样的框架添加R2DBC支持。当前使用的JDBC驱动程序不会因使用非阻塞API而受苦,实际上并不需要“反应性API”,并且几乎可以肯定每个连接不需要多个线程。

迁移工具主要与数据库的形状/结构有关,而不与内容有关,而R2DBC则针对主要关心实际数据的应用程序。

总而言之,我看不出有人会因为他们的应用程序使用R2DBC而不会使用使用JDBC的迁移工具(例如JDBC)的任何原因,而且我看不出将R2DBC支持添加到诸如液基。

答案 1 :(得分:2)

Steve的答案是正确的。R2DBC主要是与实际数据进行交互。我想添加一个不同的观点。

的确,反应式API不会在迁移期间提供任何改进。实际上,仔细观察一下,迁移是启动过程的一部分,通常是同步的,至少在某种程度上是同步的。

要求JDBC进行迁移会增加这种应用程序安排的复杂性。您需要在现有R2DBC设置中包括JDBC驱动程序,并且需要配置另一个数据库连接,该连接指向与R2DBC相同的数据库。这两个要求都容易出错,因为需要对其进行配置以使其完全相同。

现在,当类路径中有某个库可用时,应用程序配置框架(Spring Boot,Micronaut,Quarkus)会激活功能。配置JDBC驱动程序会引导应用程序不需要的功能,但在引导过程中将需要该功能,这会浪费资源。

理想情况下,您配置一种数据库连接技术,该技术可用于架构迁移和应用程序内部的以后数据交互。

因此,有必要要求LiquibaseFlyway提供基于R2DBC的集成。

答案 2 :(得分:2)

您可以尝试我的包裹r2dbc-migrate

在最低配置下(假设您使用的是Spring Boot 2.3.0.M3),只需添加

<dependency>
  <groupId>name.nkonev.r2dbc-migrate</groupId>
  <artifactId>r2dbc-migrate-spring-boot-starter</artifactId>
  <version>0.0.24</version>
</dependency>

到pom.xml

然后在类路径中添加.sql文件,例如在/db/migration/

然后添加

r2dbc.migrate.resourcesPath: classpath:/db/migration/*.sql

到您的application.yml

答案 3 :(得分:0)

以上两个答案都是正确的-只是想补充一点,如果您正在寻找快速简便的路径并且正在使用maven,那么Flyway可能是最便捷的操作方式。

您所需要的只是Flyway Maven插件,两个pom依赖项和迁移sql脚本。

例如。假设是spring-r2dbc-postgresql,则只需三个简单的步骤就可以准备好迁移基础结构:

(1)将迁移脚本添加到资源:

resources/db/migration/V1_init.sql

(2)向pom添加两个依赖项

    <dependency>
        <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
    </dependency>

(3)和构建部分中的一个插件定义:

    <plugin>
        <groupId>org.flywaydb</groupId>
           <artifactId>flyway-maven-plugin</artifactId>
           <version>6.0.0-beta2</version>
    </plugin>

现在您可以通过单个maven CLI命令进行迁移:

    mvn flyway:migrate -Dflyway.url=jdbc:postgresql://localhost:5432/test -Dflyway.user=test -Dflyway.password=test

查看更多Flyway maven插件文档here

答案 4 :(得分:0)

如果任何人遇到相同的问题并且不想使用maven-flyway-plugin,请看一下FlywayAutoConfiguration类。它有@Conditional(FlywayDataSourceCondition.class),里面有@ConditionalOnBean(DataSource.class)。因此,最重要的是您应该提供非反应性数据库环境以使Flyway正常工作。最直接的解决方案是执行以下操作:

@Configuration
public class DataBaseConfig extends AbstractR2dbcConfiguration {

    @Value("${spring.data.postgres.host}")
    private String host;
    @Value("${spring.data.postgres.port}")
    private int port;
    @Value("${spring.data.postgres.database}")
    private String database;
    @Value("${spring.data.postgres.username}")
    private String username;
    @Value("${spring.data.postgres.password}")
    private String password;

    @Bean
    public DatabaseClient databaseClient() {
        return DatabaseClient.create(connectionFactory());
    }

    @Bean
    @Override
    public PostgresqlConnectionFactory connectionFactory() {
        PostgresqlConnectionConfiguration config = PostgresqlConnectionConfiguration.builder()
                .host(host)
                .port(port)
                .database(database)
                .username(username)
                .password(password)
                .build();
        return new PostgresqlConnectionFactory(config);
    }

    @Bean
    public DataSource dataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.postgresql.Driver");
        dataSourceBuilder.url("jdbc:postgresql://" + host + ":" + port + "/" + database);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }
}

我这样走了,因为我不想: 1)在每次启动时运行插件; 2)在命令行中传递数据库属性

答案 5 :(得分:0)

请解决,最后有一个解决方案,至少是一个临时解决方案,因为还没有Flyway官方解决方案(我相信很快我们会看到一个正式版本)。

请检查我的帖子:https://stackoverflow.com/a/62864838/7681696