web-dev-qa-db-ja.com

春にHibernateを使用するReactiveCrudRepository

ReactiveCrudRepositoryの代わりにCrudRepositoryでHibernateとMysqlを使用することは可能ですか? Spring Data JpaとHibernateでいくつかのサンプルを試しましたが、動作させることができませんでした。 MongoDBおよびcassandraReactiveCrudRepositoryでサンプルをいくつか見つけることができました。

20

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

TL; DR:

HibernateとMySQLではなく、 R2DBC とPostgres、Microsoft SQL ServerまたはH2を使用します。 Spring Data R2DBC をご覧ください。

ロングバージョン

なぜJPAではありませんか?

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

これは、アトミックな変更を行い、ロード、処理、保存などすべてをブロックせずに切り離そうとするリアクティブストアを扱う方法の逆です。

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

したがって、JPAの下のテクノロジーレベルであるJDBCを調べる必要があります。ただし、JDBCはまだブロックしています。SQLステートメントをデータベースに送信すると、JDBCは結果を取得するまでブロックします。繰り返しますが、これは事後対応の考え方に反します。ブロックしないでください。これをスレッドプールにラップしてある程度緩和することもできますが、これは解決策というよりは回避策です。

なぜR2DBCなのか?

リアクティブリポジトリに使用できるいくつかのデータベースに適したドライバがいくつかあります。しかし、それらはプロプライエタリであるため、最終的にすべての(関連する)リレーショナルデータベースで実際に機能するはずの何かの良い基盤ではありません。

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

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

R2DBC([〜#〜] r [〜#〜]eactive[〜#〜] r [〜#〜]elational[〜#〜] d [〜#〜]atabase[〜#〜] a [〜#〜]ccess) はそのような標準の提案です。希望は、OracleがADBAを事後対応アプローチに移行するよう説得するのに役立つか、そうでない場合はそれ自体が標準になることです。

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

R2DBC自体は、主にSPI、つまりデータベースプロバイダーによって実装されるAPIです。 SPIは、実装者に最小限の要件を課す方法で設計されています。しかし、これにより、R2DBCの使用がやや面倒になります。 JDBCで起こったように、そのSPIの。

Spring Data R2DBC

Spring Data R2DBCはそのようなライブラリの1つであり、あなたが求めていたものを提供します。ReactiveCrudRepositoryのサポート。ただし、JPA/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をサポートするもののみが現在サポートされています。

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

37
Jens Schauder

前の回答からの引用によると

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

ジェームズ・ウォードは、それがノンブロッキングになる可能性があると主張しています。私は彼に尋ねたという意味です:

ええ、大丈夫ですが、ScalikeJDBC-Asyncはまったく同じことをしていませんか?クエリ呼び出しを別のスレッドプールに入れるだけですか?

そして彼は答えた

いいえ、ScalalikeJDBC-Asyncは https://github.com/mauricio ...を使用しているためです。これは実際には非ブロッキング(NIO)JDBCishデータベースドライバーです。

ソース

そのため、hibernate + springのデータをpostgresql-asyncに置き換えることで事後対応できます(mysqlで動作するはずです)。

2
hanskoff