web-dev-qa-db-ja.com

なぜSpringはリレーショナルデータベースのリアクティブ(非ブロッキング)クライアントを提供しないのですか?

MySQLとPostgres のようなリレーショナルDBをサポートするリアクティブアプリケーションを作成するために Vert.x ツールキットを使用しました。 Springは、CassandraやMongoなどの一部のNoSQL DBに対して事後対応サポートを提供していることを知っていますが、リレーショナルDBに対しても同じように提供してもらえますか?

10
Mis94

Spring Frameworkの背後にある考え方は何ですか?

Spring Frameworkは開発者の生産性を向上させるライブラリであり、Spring Data、Spring Security、Spring CloudなどのSpringのポートフォリオプロジェクトも同様です。

これらのプロジェクトは、JSRまたはJEPで標準化された既存のAPIの上、または有用で広く使用されていることが証明されているライブラリの上に構築されます。 Springチームは、データベースやその他の統合のためのドライバーを構築しません。これはデータベース/ドライバーベンダー次第です。

Vert.xと比較したWebFlux

Spring WebFluxは、典型的なSpringモジュールの良い例です。既存の非ブロッキングサーバー(netty、Undertow、およびJettyを介したProject Reactor)の上に構築されます。 WebFluxは、Springコンポーネントを活用して、そのようなアプリケーションの開発と実行を支援する、ノンブロッキングのリアクティブアプリケーション用のランタイムコンテナを提供します。

Vert.xは、独自の低レベル実装を提供する統合環境の優れた例です。 Vert.xは高度に最適化されており、そのようなエコシステムには最適化された統合が必要です。 Vert.xは、さまざまなデータベースの独自の実装を考え出し、Vert.xコンテキストで適切に機能するAPIを提供しますが、これらのAPIはJDBCではありません。

リレーショナルデータベースAPI

M-Razavi で既に述べたように、JavaはJDBCを使用してリレーショナルデータベースと統合し、JDBCはブロッキングの性質を持ちます。 JDBCのブロッキングの性質を緩和しようとしています。 Executor(通常Threadプール)へのJDBC呼び出しのオフロードは、プールが最終的にリクエストで飽和するため、その有用性が制限されます)。 TL; DRには、リアクティブリレーショナルデータベース統合を提供できるAPIがありません。

それでは、オプションは何ですか?

M-Razavi すでに述べた [〜#〜] adba [〜#〜] futureを使用したJavaの非同期データベースアクセス用の標準化されたAPIを提供するOracleのイニシアチブです。 ADBAのすべてはまだ進行中です。ADBAの背後にあるチームはフィードバックを喜んで受け取ります。多くのPostgresの人々が、最初の実験に使用できる Postgres ADBAドライバー に取り組んでいます。

ただし、ADBAは将来の目標であり、ADBAがJava 12でリリースされることはないと予想しています。

Reactiverseのreactive-pg-client などの独立したドライバがいくつかあります。これらのドライバーにはベンダー固有のAPIが付属しているため、Springでの広範な統合にはあまり適していません。共通のAPIを公開するために追加のレイヤーを提供する必要があります。また、新しいドライバーをアプリケーションにプラグインするだけでは、そのまま使用できます™。標準APIを使用すると、プラグインが可能になるため、標準APIを使用することには大きな価値があります。

R2DBCが助けになりますか?

標準APIとドライバーの非可用性がないため、 Pivotal のチームは、リアクティブに最適なリアクティブリレーショナルAPIの調査を開始しましたプログラミング目的。彼らは、 R2DBC を思い付きました。これは、Reactive Relational Database Connectivityの略です。現在、R2DBCは、実現可能性を評価し、ドライバーベンダーがリアクティブ/非ブロッキング/非同期ドライバーのサポートにまったく関心があるかどうかの議論を開始するためのインキュベータープロジェクトです。

現在、3つのドライバー実装があります。

R2DBCには、API仕様(r2dbc-spi)と、アプリケーションでSPIを使用可能にするクライアント(r2dbc-client)が付属しています。データベースクライアントおよびリアクティブリポジトリをサポートするリアクティブAPIを提供する Spring Data R2DBC 統合の調査を開始しました。

R2DBCとそのエコシステムはまだ若く、ユースケースを収集し、リアクティブリレーショナルデータベース統合が意味をなすかどうかを確認するための実験とフィードバックを求めています。

現在、Spring Dataを介してR2DBCを使用でき、次のスニペットはDatabaseClientの使用法を示しています。

PostgresqlConnectionFactory connectionFactory = new PostgresqlConnectionFactory(…);

DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);

Mono<Integer> count = databaseClient.execute()
                .sql("INSERT INTO legoset (id, name, manual) VALUES($1, $2, $3)")
                .bind("$1", 42055)
                .bind("$2", "Description")
                .bindNull("$3", Integer.class)
                .fetch()
                .rowsUpdated();

Flux<Map<String, Object>> rows = databaseClient.execute()
                .sql("SELECT id, name, manual FROM legoset")
                .fetch()
                .all();
31
mp911de

Spring WebFluxは、ノンブロッキングRESTアプリケーションを作成する優れた方法です。 JDBCがブロックしているため、WebFluxの使用を開始するときに遭遇する問題の1つはJDBCです。 CassandraやCouchbaseなどの新しい学校データベースには、非ブロッキングドライバーがあります。 Couchbaseの場合、そのドライバーはRXJavaを使用します。データベース用の非同期ドライバーを作成するための努力と、ADBAを作成するためのOracleの努力があります。残念ながら、これらは初期の段階であり、JVMでSQLデータベースと通信したい場合は、ブロッキングドライバーで立ち往生しています。
実際には、Springはリレーショナルデータベース用の非ブロッキングドライバーを提供する責任を負いません。

5
M-Razavi