web-dev-qa-db-ja.com

R2DBCを使用したデータベースの移行

R2DBCは初めてです( https://r2dbc.io/ )。 r2dbcのエコシステムにデータベース移行ツール/フレームワークがあるかどうかを知りたいです。

LiquibaseとFlywayはJDBCに依存しているようです。それらのフレームワークがr2dbcドライバーをサポートできるようにする計画はありますか?

どんな入力やフィードバックも歓迎します。

8
balteo

Steveの答えは正解です。R2DBCは主に実際のデータとの相互作用についてです。別の視点を追加したいと思います。

移行中、リアクティブAPIが改善をもたらさないのは事実です。実際、よく見ると、移行は起動プロセスの一部であり、通常は同期しており、少なくともある程度は同期しています。

移行にJDBCが必要になると、このようなアプリケーションの配置がさらに複雑になります。既存のR2DBCセットアップにJDBCドライバーを含める必要があり、R2DBCと同じデータベースを指す別のデータベース接続を構成する必要があります。両方の要件は、まったく同じことを行うように構成する必要があるため、エラーが発生しやすくなります。

現在、特定のライブラリがクラスパスから利用可能になると、アプリケーション構成フレームワーク(Spring Boot、Micronaut、Quarkus)が機能をアクティブにします。 JDBCドライバーを構成すると、アプリケーションには必要ありませんが、ブートストラップ中に必要な機能が起動します。これは、リソースの浪費のようなものです。

理想的には、スキーマの移行やアプリケーション内での後のデータ対話に再利用される単一のデータベース接続テクノロジーを構成します。

したがって、R2DBCベースの統合を提供するために Liquibase および Flyway を要求することは理にかなっています。

12
mp911de

(R2DBC Webページのフロントページをざっと一目見ただけで)R2DBCの目標が実際に移行に関係していることは、私には思えません。このページには、主な機能が次のようにリストされています。

  • リアクティブストリーム-R2DBCは、完全にリアクティブなノンブロッキングAPIを提供するリアクティブストリームに基づいています。
  • リレーショナルデータベース-R2DBCは、SQLデータベースをリアクティブAPIと連携させます。これは、JDBCをブロックする性質では不可能です。
  • スケーラブルなソリューション-Reactive Streamsは、従来の接続ごとの1つのスレッドアプローチから、より強力でスケーラブルなアプローチへの移行を可能にします。

LiquibaseのようなフレームワークにR2DBCサポートを追加することを保証するものは何もありません。現在使用中のJDBCドライバーは、ノンブロッキングAPIの使用による影響を受けず、「リアクティブAPI」を実際に必要とせず、ほとんどの場合、接続ごとに複数のスレッドを必要としません。

移行ツールは主にデータベースの形状/構造に関係し、コンテンツには関係しませんが、R2DBCは主に実際のデータに関心があるアプリケーションを対象としています。

要約すると、アプリケーションがR2DBCを使用しているという理由だけで、JDBCを使用するLiquibaseのような移行ツールを使用しない理由はありません。また、LiquibaseのようなツールにR2DBCサポートを追加する利点もありません。

3
SteveDonie

誰かが同じ問題に直面し、_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)コマンドラインでデータベースプロパティを渡します

0
Ivan Timoshin

私のパッケージ 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に

0
Nikita Konev

上記の両方の答えは正しいです。すばやく簡単な方法を探していて、Mavenを使用している場合は、Flywayがおそらく最も便利な操作方法であることを付け加えておきます。

必要なのは、Flyway Mavenプラグイン、2つのpom依存関係、および移行SQLスクリプトだけです。

例えば。春-r2dbc-postgresqlを想定すると、3つの簡単な手順で移行インフラストラクチャを準備できます。

(1)移行スクリプトをリソースに追加します。

resources/db/migration/V1_init.sql

(2)pomに2つの依存関係を追加する

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

(3)およびビルドセクションの1つのプラグイン定義:

    <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プラグインのドキュメントをもっと見る こちら

0
tomaszkubacki