R2DBCのサポートを実装します。 これはjdbi-r2dbc
ようなものかもしれません。 ご参考までに:
https://r2dbc.io/
https://github.com/r2dbc
また、リアクティブプラットフォームの一部であるvlingo-symbio
でJdbiをサポートしています。 見てみな。 私たちはあなたのチームが私たちの完全なプラットフォームでスピードアップすることを望んでいます。
こんにちはボーン、ポインタをありがとう。 Reactiveは非常に新しくエキサイティングですが、私の理解では、JDBCの現在の実装、そして実際にはデータベースサーバーソフトウェア自体が、下位層でのReactiveの概念の候補としては不十分です。 データベースサーバーには、クエリを受け取って結果を生成するワーカープロセスがあり、各プロセスは完了するまでクエリを処理します。 10個のクエリを非同期で送信し、その結果を待つ機能はありません。
つまり、JDBCリアクティブを実装すると、接続/ハンドル、サービスクエリを保持し、結果をリアクティブフレームワークに出力する古いスタイルのスレッドプールを実装する必要があることが最終的にわかります。 これは、リアクティブの利点のいくつか、特にリアクティブコードを記述できることを意味しますが、リアクティブが達成しようとするスケーラビリティの利点を大幅に制限します。
したがって、API統合を歓迎しますが、最後に調査してからJDBCの世界の状態が変わっていない限り、その下のコードがまだ古い学校のスレッドコードであるという事実を隠すだけのやや限定的なラッパーになります。
私はあなたのプラットフォームに慣れるという申し出に感謝しますが、私たちのライブラリはほぼ完全にスタンドアロンであり、プラットフォームやフレームワークの一部ではないことを誇りに思っています。 ですから、私たちはインスピレーションを探し、常に共通の目標に向かって協力することをいとわないかもしれませんが、私たちは非常に独立したプロジェクトです:)
ねえ、スティーブン! コメントしてくれてありがとう。 現在、 vlingo-symbio
実装のアクター内でリクエストをシリアル化することにより、reactive-over-JDBCを解決しています。 接続制限に適した数のJDBCObjectStoreActor
を作成できますが、アクター自体がJDBCに同期的にアクセスします。 さらに、アクターで実行されているObjectStore
実装のクライアントは、クエリが実行されている間はブロックしません。
私はR2DBCを完全に理解していませんが、完全なJDBCの代替品であると宣伝されており、データベースドライバーとして完全に非同期で動作します。 現在、PostgresとMS SQL Serverのみの実装がありますが、将来的には成長する可能性があります。 JdbiがR2DBCを介して実装するのはどういうことかと思っていました。 これが今のところ意味をなさないかどうかはわかりますが、将来的に意味がある場合に備えて、ここに参照があります。 ストレスがない :)
興味深いことに、彼らは実際に独自のドライバーを提供しています。 ですから、ここにはいくつかのメリットがあるかもしれません!
ベンチマーク、概念実証コードなど、これをさらに詳しく調べたいと思います。いくつかの制限があるようです。postgres用のr2dbcドライバーは、たとえばBLOB
およびCLOB
タイプはアドバタイズしないことをアドバタイズします。まだ機能しており、ストアドプロシージャやCALL
についてはまったく言及されていません。
しかし、少なくとも今のところ個人的に焦点を当てているのは他の場所です。ここで探索を開始する時間がないため、コミュニティの意見や注意が必要になる場合があります。他のコアメンバーがどちらかにジャンプします。
コミュニティの他のメンバーからこれが必要な機能であると投票しただけでも、もっと聞くのを楽しみにしています。
このチケットを見てうれしいです。
R2DBCの状態を明確にするために、2つのことをすばやく削除したいと思いました。
いずれにせよ、R2DBCは、Spring Data R2DBC、R2DBCクライアント(jdbiからいくつかのアイデアを提供するR2DBC SPIの上の小さなラッパー)などのクライアント実装によってSPIがピックアップされることを目指しています。
私のオリジナルのプロトタイプ/デモンストレーションクライアントレイヤーであるr2dbc-client
は、JdbiのAPIと精神に基づいて設計されていることを伝えたかっただけです。 さらに調査することを選択した場合、それはおなじみだと思います😄。
私は人々がJDBIからRxのものを公開するのを見ました(例えば@hgschmie )。 R2DBCの「サポート」が何を意味するのかわかりません。
JDBIの上にR2DBCを実装すること、JDBiにR2DBC Connection
を消費させること、Rxインターフェイスに焦点を合わせるためにJDBIを交換すること、または...何か他のものについて話しているのですか?
私はそれが「JDBIインタフェースを暴露、JDBIが使用するR2DBCドライバをサポート」だろうと思いますか?
R2DBCは、JDBCの非同期置換です。
@brianm R2DBCは、ThreadPools上のJDBCではありません。 R2DBCは2つのことを意味します:
org.reactivestreams.Publisher
タイプを返す非ブロッキングトランスポート層を使用する実装です。 それらは下でJDBCドライバーを使用しませんが、ワイヤープロトコルを最初から実装します。JDBIの上にR2DBCを実装し、JDBiにR2DBC接続を消費させることについて話しているのですか?
はい、これが基本的な意味です。 Project Reactor / RxJava2 / Zerodepタイプを返すR2DBC固有のJDBIモジュールがあります。
私はR2DBCが何であるかを理解していると確信しており、それは非常に良いことだと思います。
それに対する「JDBIサポート」とは何かを理解しようとしています!
たぶん、JDBIのAPIを介して期待することのコードサンプルを書いてください。
初心者のために以下をサポートするのはどうですか?
Jdbi jdbi = Jdbi.create("r2dbc:h2:mem:///test"); // (H2 in-memory database), obtain ConnectionFactory via ConnectionFactories.get(String url)
// Reactor style:
Flux<User> users = jdbi.withHandle(handle -> {
return handle.execute("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)")
.then(handle.execute("INSERT INTO user(id, name) VALUES (?0, ?1)", 0, "Alice"))
.then(handle.createUpdate("INSERT INTO user(id, name) VALUES (?0, ?1)")
.bind(0, 1)
.bind(1, "Bob")
.execute())
.then(handle.createQuery("SELECT * FROM user ORDER BY name")
.mapToBean(User.class).many());
});
// RxJava style
Flowable<User> users = jdbi.withHandle(handle -> { … });
インターフェイスベースのサポートは次のようになります。
public interface UserDao {
@SqlUpdate("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)")
Completable createTableRxJava();
@SqlUpdate("CREATE TABLE user (id INTEGER PRIMARY KEY, name VARCHAR)")
Mono<Void> createTableProjectReactor();
@SqlQuery("SELECT * FROM user ORDER BY name")
@RegisterBeanMapper(User.class)
Flowable<User> listUsersRxJava();
@SqlQuery("SELECT * FROM user ORDER BY name")
@RegisterBeanMapper(User.class)
Flux<User> listUsersProjectReactor();
}
RxJavaとProjectReactorについては意見が分かれていないため、両方のAPIを使用してバリアントを一覧表示しようとしました。
誰かがここで正確に何が提案されているのかを明確にすることができますか?
R2DBCはJDBCの上のレイヤーですか、それとも独自のものですか? Jdbiは極端にJDBCに結合されているためです。
R2DBCは、JDBCの上のレイヤーではありません。 R2DBCはSQLデータベースにアクセスするための非ブロッキングAPIであり、それ自体が独自のものです(R2DBCドライバーは通常、非ブロッキングI / Oレイヤーを使用してベンダー固有のワイヤープロトコルを実装するゼロから作成されます)。 必要に応じて、R2DBCはSQLデータベースと統合する方法の事後対応仕様です。
ここでの提案は、Jdbiのように見え、動作するが、R2DBCドライバーの下で使用するAPIを持つことです。 APIは、スカラーオブジェクトを返す代わりに、リアクティブストリームタイプを返します。
説明をありがとう。 ここでの最初のステップは、R2DBCの上に上記の例を実装する方法を示すPoCとして最小限の役割を果たすJdbiフォークまたはブランチのプロトタイプを作成することだと思います。 そこから、既存のJDBCサポートと並行して統合に向けたパスを決定するか、ハードフォークとして優れていることを確認する必要があります。 Matthewが上記で指摘しているように、現在、JDBCと緊密に連携しており、変更は大変な作業になる可能性があり、重大な変更が必要になる可能性があります。
私はこれをプロジェクトの長期的なレーダーに載せることに興奮していますが、コミュニティの重要な関与なしに迅速に動くことは期待していません。
@stevenschlansker最初に、 JDBIに触発されたr2dbc r2dbc
モジュール( jdbi-r2dbc
)をJDBIに次のように導入するプルリクエスト/ PoCについてどう思いますか。
ConnectionFactory cf = …;
Rdbi rdbi = new Rdbi(cf);
rdbi.inTransaction(handle ->
handle.execute("INSERT INTO test VALUES ($1)", 100))
.thenMany(rdbi.inTransaction(handle ->
handle.select("SELECT value FROM test")
.mapResult(result -> result.map((row, rowMetadata) -> row.get("value", Integer.class)))))
.subscribe(System.out::println);
とてもかっこいい。 はい、作業が適度にシームレスな方法で統合できる場合は、モジュールで喜んでインキュベートします。
どういうわけかRdbi
apiがJdbi
から「来た」としたらいいでしょう- jdbi.installPlugin(...).registerRowMapper(...)
を実行すると、「来た」 Rdbi
インスタンスがあればfrom "そのJdbi
も構成を取得します。 <strong i="11">@SqlUpdate</strong> CompletableFuture<ResultType> doSomeWork(...);
や、適切なリアクティブタイプが何であれ、そのようなことができると便利です。
最も参考になるコメント
このチケットを見てうれしいです。
R2DBCの状態を明確にするために、2つのことをすばやく削除したいと思いました。
いずれにせよ、R2DBCは、Spring Data R2DBC、R2DBCクライアント(jdbiからいくつかのアイデアを提供するR2DBC SPIの上の小さなラッパー)などのクライアント実装によってSPIがピックアップされることを目指しています。