30

ReactiveCrudRepositoryの代わりにHibernate と RDBMS (Mysql、Postgres など) を使用することは可能CrudRepositoryですか? Spring Data Jpa と Hibernate でいくつかのサンプルを試しましたが、うまくいきませんでした。ReactiveCrudRepositoryMongoDB とcassandraのサンプルはわずかしか見つかりませんでした。

4

4 に答える 4

61

ReactiveCrudRepositoryの代わりにHibernate と Mysql を使用することは可能CrudRepositoryですか?

TL;DR:

Hibernate と MySQL ではなく、R2DBCと Postgres、Microsoft SQL Server または H2 です。Spring Data R2DBCを見てください。

ロングバージョン

なぜJPAではないのですか?

Hibernate/JPA が含まれていれば、近い将来、これは起こりません。JPA は、データ モデルの一部をメモリにロードし、結果のオブジェクト モデルを操作して、JPA にこれらの変更を変換させるという考えに基づいています。これらすべてが 1 つのトランザクション内で行われます。

これは、アトミックな変更を行い、ロード、処理、保存、およびこれらすべてをブロックせずに分離しようとするリアクティブ ストアを処理する方法とは、一種の逆です。

なぜJDBCではないのですか?

したがって、JPA の下のテクノロジ レベルである JDBC に注目する必要があります。しかし、JDBC はまだブロックしています。SQL ステートメントをデータベースに送信すると、JDBC は結果が得られるまでブロックします。また、これはリアクティブの考え方に反します: ブロックしないでください。これをスレッドプールにラップして、これをある程度軽減することもできますが、それは解決策というよりは回避策です。

R2DBC を使用する理由

リアクティブ リポジトリに使用できる一部のデータベースには、適切なドライバーがいくつかあります。しかし、それらは独自仕様であるため、最終的にすべての (関連する) リレーショナル データベースで実際に機能する必要があるものの優れた基盤ではありません。

しばらくの間、Spring Data チームはADBAがそのギャップを埋めることを望んでいました。しかし、メーリング リストでの議論により、ADBA はリアクティブを目的としておらず、非同期のみを目的としていることが明らかになりました。ここでも、リアクティブ リポジトリの抽象化に必要なものではありません。

そのため、2018 年の初めに、交差点やリアクティブとリレーショナルに住むさまざまな人々が、リアクティブ データベース アクセスの標準が必要であると判断しました。

R2DBC ( Reactive Relational Database Connectivity )は、そのような標準 の提案です。オラクルがADBAをリアクティブなアプローチに移行するよう説得するのに役立つか、それが起こらなければそれ自体が標準になることが期待されています.

そして、すでに 3 つの実装が利用可能であるため、2 番目のオプションの可能性は有望に見えます。

R2DBC 自体は主に SPI、つまりデータベース プロバイダーによって実装される API です。SPI は、実装者に最小限の要件を課すように設計されています。しかし、これは R2DBC の使用をやや面倒にします。JDBCで起こったように、他のライブラリがそのSPIの上に使いやすさのために設計されたライブラリを強化して構築するという考えです。

春のデータ R2DBC

Spring Data R2DBC はそのようなライブラリの 1 つであり、あなたが求めていたものを提供します: ReactiveCrudRepositoryJPA/Hibernate から独立していますが、MySQL はまだサポートされていません。

プロジェクトの状況

R2DBC と Spring Data R2DBC はどちらもまだ製品リリースがなく、そこに到達するには少なくとも数か月かかるでしょう。

Spring Data R2DBC は、最初のマイルストーンをリリースしました。現在の機能については、リリース記事を参照してください。

R2DBC は 6 番目のマイルストーンにあります。詳しくはリリース記事をご覧ください

この回答も参照してください: Spring がリレーショナル データベース用のリアクティブ (非ブロッキング) クライアントを提供しないのはなぜですか?

考古学者の参考としての元の回答:

現在(2017年1月)現在、それは不可能です。

Spring Data のリアクティブ部分に現在関連するリリースは Spring Data Kay M1です (プロジェクトのホームページで 利用可能な新しいバージョンがあるかどうかを確認できます)

そして、Spring Data チームからのそのリリースと、具体的にはその中のリアクティブ部分に関するブログ投稿 (強調は私のもの) で始まります。

Spring Data Kay M1 は、リアクティブ データ アクセスをサポートする最初のリリースです。サポートされているストアの最初のセット ( MongoDB、Apache Cassandra、および Redis ) はすべてリアクティブ ドライバーを既に出荷しているため、このようなプロトタイプの非常に自然な候補となりました。

その理由は、リレーショナル データベースにアクセスするための標準的なノンブロッキングの方法がないためです。したがって、この種の API をサポートするものだけが現在サポートされています。

ReactiveCrudRepositoryJPAまたはJDBCを使用して実装し、作業をスレッドプールに委譲することができます。これにより、外部で非同期 API が提供されますが、依然としてスレッドのリソースが消費され、独立したデータ アクセス間でブロックされるため、リアクティブ アプローチの利点のごく一部しか実現されません。

于 2017-01-07T06:12:56.277 に答える