Jdbi: Mendukung R2DBC

Dibuat pada 7 Feb 2019  ·  16Komentar  ·  Sumber: jdbi/jdbi

Menerapkan dukungan untuk R2DBC. Ini mungkin sesuatu seperti jdbi-r2dbc . FYI:

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

Juga, kami mendukung Jdbi di vlingo-symbio yang merupakan bagian dari platform reaktif kami. Coba lihat. Kami ingin meningkatkan kecepatan tim Anda di platform lengkap kami.

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

help wanted integration

Komentar yang paling membantu

Senang melihat tiket ini.

Saya ingin segera menjatuhkan dua hal untuk memperjelas keadaan R2DBC:

  • Ini masih merupakan inisiatif muda dan hal-hal seperti dukungan BLOB/CLOB dan Prosedur Tersimpan harus diterapkan sebelum kita memulai GA.
  • Driver sepenuhnya reaktif dan non-blocking yang berarti seluruh bagian I/O non-blocking. Tidak ada pembongkaran pekerjaan pemblokiran ke kumpulan utas.

Bagaimanapun, R2DBC bertujuan agar SPI diambil oleh implementasi klien seperti Spring Data R2DBC, R2DBC Client (pembungkus kecil di atas R2DBC SPI yang meminjamkan beberapa ide dari jdbi) dan banyak lagi yang akan datang.

Semua 16 komentar

Hai Vaughn, terima kasih atas petunjuknya. Reaktif sangat baru dan menarik tetapi pemahaman saya adalah bahwa implementasi JDBC saat ini, dan pada kenyataannya perangkat lunak server database itu sendiri, menjadikannya kandidat yang buruk untuk konsep reaktif di lapisan bawah. Server database memiliki proses pekerja yang mengambil kueri dan menghasilkan hasil, dan setiap proses akan mengerjakan kuerinya hingga selesai. Tidak ada kemampuan untuk mengirimkan 10 kueri secara asinkron dan menunggu hasilnya.

Ini berarti bahwa saat Anda menerapkan JDBC reaktif, Anda akhirnya menemukan bahwa Anda harus menerapkan kumpulan utas gaya lama yang menyimpan koneksi/pegangan Anda, kueri layanan, dan kemudian memancarkan hasil ke dalam kerangka kerja reaktif. Ini berarti bahwa Anda dapat memperoleh beberapa manfaat dari reaktif, khususnya Anda dapat menulis kode reaktif, tetapi ini sangat membatasi manfaat skalabilitas yang coba dicapai oleh reaktif.

Jadi kami pasti akan menyambut integrasi API, tetapi kecuali keadaan dunia JDBC telah pindah sejak terakhir saya selidiki, itu akan menjadi pembungkus yang agak terbatas yang hanya menyembunyikan fakta bahwa kode di bawahnya masih merupakan kode ulir sekolah lama.

Saya menghargai tawaran untuk mempercepat platform Anda, tetapi perpustakaan kami bangga karena hampir sepenuhnya berdiri sendiri dan bukan bagian dari platform atau kerangka kerja apa pun. Jadi, meskipun kami mungkin mencari inspirasi dan selalu bersedia berkolaborasi untuk mencapai tujuan bersama, kami adalah proyek yang sangat mandiri :)

Hei, Steven! Terima kasih atas komentar Anda. Saat ini kami menyelesaikan reaktif-over-JDBC dengan membuat serial permintaan di dalam aktor dalam implementasi vlingo-symbio . Anda dapat membuat JDBCObjectStoreActor sebanyak yang masuk akal untuk batasan koneksi Anda, tetapi aktor itu sendiri mengakses JDBC secara sinkron. Lebih dari itu, klien dari implementasi ObjectStore berjalan pada aktor tidak memblokir saat kueri dipenuhi.

Saya tidak memiliki pemahaman menyeluruh tentang R2DBC, tetapi disebut-sebut sebagai pengganti JDBC penuh dan bekerja sepenuhnya secara tidak sinkron sebagai driver database. Saat ini hanya ada implementasi untuk Postgres dan MS SQL Server, tetapi mungkin akan bertambah seiring waktu. Saya bertanya-tanya seperti apa Jdbi diimplementasikan melalui R2DBC. Saya mengerti jika ini tidak masuk akal untuk Anda sekarang, tetapi referensinya ada di sini jika itu terjadi di masa mendatang. Tanpa stres :)

Menariknya, mereka memang menyediakan driver sendiri. Jadi mungkin ada beberapa manfaat yang bisa didapat di sini!

Saya ingin menjelajahi ini lebih lanjut: tolok ukur, bukti kode konsep, dll. Tampaknya ada beberapa batasan: driver r2dbc mereka untuk postgres mengiklankan bahwa misalnya tipe BLOB dan CLOB tidak belum berfungsi, dan tidak disebutkan sama sekali tentang prosedur tersimpan atau CALL .

Tapi setidaknya fokus saya secara pribadi sekarang adalah di tempat lain jadi ini mungkin memerlukan masukan dan perhatian komunitas untuk bergerak maju, karena saya tidak punya waktu sekarang untuk membuka eksplorasi di sini, dan saya tidak membayangkan anggota inti lainnya mencari untuk melompat di atasnya baik.

Berharap untuk mendengar lebih banyak, bahkan jika hanya suara dari anggota komunitas lainnya bahwa ini adalah fitur yang dibutuhkan.

Senang melihat tiket ini.

Saya ingin segera menjatuhkan dua hal untuk memperjelas keadaan R2DBC:

  • Ini masih merupakan inisiatif muda dan hal-hal seperti dukungan BLOB/CLOB dan Prosedur Tersimpan harus diterapkan sebelum kita memulai GA.
  • Driver sepenuhnya reaktif dan non-blocking yang berarti seluruh bagian I/O non-blocking. Tidak ada pembongkaran pekerjaan pemblokiran ke kumpulan utas.

Bagaimanapun, R2DBC bertujuan agar SPI diambil oleh implementasi klien seperti Spring Data R2DBC, R2DBC Client (pembungkus kecil di atas R2DBC SPI yang meminjamkan beberapa ide dari jdbi) dan banyak lagi yang akan datang.

Hanya ingin berpadu dan menyebutkan bahwa lapisan klien prototipe/demonstrasi asli saya, r2dbc-client dirancang berdasarkan API dan etos Jdbi. Jika Anda memilih untuk menyelidiki lebih lanjut, saya pikir Anda akan merasa familiar .

Saya telah melihat orang-orang mengekspos hal-hal Rx dari JDBI ( @hgschmie misalnya). Saya tidak yakin apa arti "dukungan" untuk R2DBC.

Apakah Anda berbicara tentang mengimplementasikan R2DBC di atas JDBI, meminta JDBi menggunakan R2DBC Connection s, menukar JDBI untuk fokus pada antarmuka Rx, atau... sesuatu yang lain?

Saya pikir itu akan "mendukung driver R2DBC untuk digunakan oleh JDBI, memperlihatkan antarmuka JDBI"?

R2DBC adalah pengganti async untuk JDBC.

@brianm R2DBC bukan JDBC di ThreadPools. R2DBC berarti dua hal:

  1. Driver R2DBC adalah implementasi yang menggunakan lapisan transport non-blocking yang mengembalikan tipe org.reactivestreams.Publisher untuk setiap operasi terikat-I/O. Mereka tidak menggunakan driver JDBC di bawahnya tetapi menerapkan protokol kawat dari awal.
  2. R2DBC adalah SPI standar (vendor-independen) yang memungkinkan untuk membangun perpustakaan klien di atas. Implementasi driver dapat dipertukarkan seperti yang dilakukan hari ini untuk JDBC.

Apakah Anda berbicara tentang mengimplementasikan R2DBC di atas JDBI, meminta JDBi menggunakan Koneksi R2DBC

Ya, ini adalah apa yang pada dasarnya berarti. Memiliki modul JDBI khusus R2DBC yang mengembalikan tipe Project Reactor/RxJava2/Zerodep.

Saya cukup yakin saya mengerti apa itu R2DBC, dan saya pikir itu adalah Hal yang Sangat Bagus.

Saya mencoba mencari tahu apa "dukungan JDBI" untuk itu!

Mungkin menulis contoh kode dari apa yang Anda harapkan untuk dilakukan melalui API JDBI?

Bagaimana dengan mendukung yang berikut ini sebagai permulaan:

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 -> { … });

Dukungan berbasis antarmuka dapat terlihat seperti:

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();
}

Saya tidak berpendapat tentang RxJava vs. Project Reactor, oleh karena itu saya mencoba membuat daftar varian menggunakan kedua API.

Bisakah seseorang mengklarifikasi apa sebenarnya yang diusulkan di sini?

Apakah R2DBC merupakan lapisan di atas JDBC, atau miliknya sendiri? Karena Jdbi digabungkan ke JDBC secara ekstrim.

R2DBC bukan lapisan di atas JDBC. R2DBC adalah API non-pemblokiran untuk mengakses database SQL dan itu adalah miliknya sendiri (driver R2DBC biasanya ditulis dari awal mengimplementasikan protokol kawat khusus vendor menggunakan lapisan I/O non-pemblokiran). Jika Anda mau, R2DBC adalah spesifikasi reaktif tentang cara mengintegrasikan dengan database SQL.

Proposal di sini akan memiliki API yang terlihat dan berfungsi seperti Jdbi tetapi menggunakan driver R2DBC di bawahnya. Alih-alih mengembalikan objek skalar, API akan mengembalikan jenis Aliran Reaktif.

Terimakasih atas klarifikasinya. Saya berharap langkah pertama di sini adalah membuat prototipe garpu atau cabang Jdbi yang berfungsi minimal sebagai PoC yang menunjukkan cara mengimplementasikan contoh di atas di atas R2DBC. Dari sana kita harus menentukan jalan menuju integrasi secara paralel dengan dukungan JDBC yang ada, atau menetapkan bahwa itu akan lebih baik sebagai garpu keras. Seperti yang ditunjukkan Matthew di atas, kami saat ini terikat erat dengan JDBC dan perubahan yang mungkin membutuhkan banyak kerja keras dan juga berpotensi memerlukan perubahan yang melanggar.

Saya senang memiliki ini di radar jangka panjang proyek, tetapi saya tidak berharap itu bergerak cepat tanpa keterlibatan masyarakat yang signifikan.

@stevenschlansker Kami awalnya membuat r2dbc-client yang terinspirasi oleh JDBI. Apa pendapat Anda tentang pull request/PoC yang memperkenalkan modul r2dbc ( jdbi-r2dbc ) sebagai kontribusi dari R2DBC Client kembali ke JDBI di sepanjang baris:

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);

Sangat keren. Ya, jika pekerjaan dapat diintegrasikan dengan cara yang cukup mulus, kami akan dengan senang hati menginkubasinya dalam sebuah modul!

Akan lebih baik jika entah bagaimana Rdbi api "berasal dari" Jdbi -- dalam hal itu ketika Anda melakukan jdbi.installPlugin(...).registerRowMapper(...) maka setiap Rdbi instance yang "datang dari" itu Jdbi juga mendapatkan konfigurasinya. Akan menyenangkan juga untuk dapat melakukan hal-hal seperti <strong i="11">@SqlUpdate</strong> CompletableFuture<ResultType> doSomeWork(...); atau apa pun jenis reaktif yang sesuai.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat