Jdbi: R2DBCをサポートする

作成日 2019年02月07日  ·  16コメント  ·  ソース: jdbi/jdbi

R2DBCのサポートを実装します。 これはjdbi-r2dbcようなものかもしれません。 ご参考までに:

https://r2dbc.io/
https://github.com/r2dbc

また、リアクティブプラットフォームの一部であるvlingo-symbioでJdbiをサポートしています。 見てみな。 私たちはあなたのチームが私たちの完全なプラットフォームでスピードアップすることを望んでいます。

https://github.com/vlingo/vlingo-symbio-jdbc/tree/master/src/main/java/io/vlingo/symbio/store/object/jdbc/jdbi

help wanted integration

最も参考になるコメント

このチケットを見てうれしいです。

R2DBCの状態を明確にするために、2つのことをすばやく削除したいと思いました。

  • これはまだ若いイニシアチブであり、GAに移行する前に、BLOB / CLOBやストアドプロシージャのサポートなどを実装する必要があります。
  • ドライバーは完全にリアクティブで非ブロッキングです。つまり、I / O部分全体が非ブロッキングです。 ブロッキング作業をスレッドプールにオフロードすることはありません。

いずれにせよ、R2DBCは、Spring Data R2DBC、R2DBCクライアント(jdbiからいくつかのアイデアを提供するR2DBC SPIの上の小さなラッパー)などのクライアント実装によってSPIがピックアップされることを目指しています。

全てのコメント16件

こんにちはボーン、ポインタをありがとう。 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つのことをすばやく削除したいと思いました。

  • これはまだ若いイニシアチブであり、GAに移行する前に、BLOB / CLOBやストアドプロシージャのサポートなどを実装する必要があります。
  • ドライバーは完全にリアクティブで非ブロッキングです。つまり、I / O部分全体が非ブロッキングです。 ブロッキング作業をスレッドプールにオフロードすることはありません。

いずれにせよ、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つのことを意味します:

  1. R2DBCドライバーは、I / Oバウンド操作ごとにorg.reactivestreams.Publisherタイプを返す非ブロッキングトランスポート層を使用する実装です。 それらは下でJDBCドライバーを使用しませんが、ワイヤープロトコルを最初から実装します。
  2. R2DBCは、標準化された(ベンダーに依存しない)SPIであり、その上にクライアントライブラリを構築できます。 ドライバーの実装は、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(...);や、適切なリアクティブタイプが何であれ、そのようなことができると便利です。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

goxr3plus picture goxr3plus  ·  4コメント

jimmyhmiller picture jimmyhmiller  ·  6コメント

keith-miller picture keith-miller  ·  3コメント

agavrilov76 picture agavrilov76  ·  5コメント

stevenschlansker picture stevenschlansker  ·  4コメント