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 的状态:

  • 这仍然是一个年轻的计划,在我们进行 GA 之前,将实施诸如 BLOB/CLOB 和存储过程支持之类的东西。
  • 驱动程序是完全响应式和非阻塞的,这意味着整个 I/O 部分是非阻塞的。 没有将阻塞工作卸载到线程池中。

无论如何,R2DBC 的目标是让 SPI 被客户端实现接收,例如 Spring Data R2DBC、R2DBC Client(R2DBC SPI 之上的一个小包装器,它提供了一些来自 jdbi 的想法)等等。

所有16条评论

嗨,沃恩,谢谢你的指点。 反应式是非常新的和令人兴奋的,但我的理解是 JDBC 的当前实现,实际上是数据库服务器软件本身,使它成为较低层反应式概念的一个糟糕的候选者。 数据库服务器具有接受查询并产生结果的工作进程,每个进程将处理其查询直到完成。 无法异步提交 10 个查询并等待它们的结果。

这意味着当你实现 JDBC 反应式时,你最终会发现你必须实现一个旧式的线程池来保存你的连接/句柄、服务查询,然后将结果发送到反应式框架中。 这意味着您可以获得反应式的一些好处,特别是您可以编写反应式代码,但它严重限制了反应式尝试实现的可扩展性好处。

所以我们绝对欢迎 API 集成,但除非自从我上次调查以来 JDBC 世界的状态发生了变化,否则它将是一个有限的包装器,它只是隐藏了下面的代码仍然是老派线程代码的事实。

我很感激提供在您的平台上加快速度的提议,但我们的库以几乎完全独立而不是任何平台或框架的一部分而自豪。 因此,虽然我们可能会寻找灵感并始终愿意为实现共同目标而合作,但我们是一个非常独立的项目:)

嘿,史蒂文! 感谢您的意见。 目前,我们通过在vlingo-symbio实现中的actor 内序列化请求来解决reactive-over-JDBC。 您可以根据连接限制创建尽可能多的JDBCObjectStoreActor ,但参与者本身会同步访问 JDBC。 更重要的是,在执行查询时,在 actor 上运行的ObjectStore实现的客户端不会阻塞。

我对 R2DBC 没有透彻的了解,但它被吹捧为一个完整的 JDBC 替代品,并且作为数据库驱动程序完全异步工作。 目前只有 Postgres 和 MS SQL Server 的实现,但可能会随着时间的推移而增长。 我想知道 Jdbi 在 R2DBC 上实现会是什么样子。 我明白这对你来说现在是否有意义,但参考在这里,以防它在未来的某个时间发生。 无压力 :)

有趣的是,他们实际上确实提供了自己的驱动程序。 所以也许这里有一些好处!

我很想进一步探索这个:基准测试、概念验证代码等。似乎有一些限制:他们用于 postgres 的 r2dbc 驱动程序广告,例如BLOBCLOB类型不工作,并且根本没有提到存储过程或CALL

但至少我个人现在的重点在别处,所以这可能需要一些社区投入和关注才能向前推进,因为我现在没有时间在这里展开探索,而且我不认为其他核心成员正在寻求跳上它。

期待听到更多,即使只是来自社区其他成员的投票,认为这是一个必需的功能。

很高兴看到这张票。

我想快速删除两件事来澄清 R2DBC 的状态:

  • 这仍然是一个年轻的计划,在我们进行 GA 之前,将实施诸如 BLOB/CLOB 和存储过程支持之类的东西。
  • 驱动程序是完全响应式和非阻塞的,这意味着整个 I/O 部分是非阻塞的。 没有将阻塞工作卸载到线程池中。

无论如何,R2DBC 的目标是让 SPI 被客户端实现接收,例如 Spring Data R2DBC、R2DBC Client(R2DBC SPI 之上的一个小包装器,它提供了一些来自 jdbi 的想法)等等。

只是想插一句并提到我最初的原型/演示客户端层r2dbc-client是基于 Jdbi 的 API 和精神设计的。 如果您确实选择进一步调查,我想您会发现它很熟悉😄。

我见过有人从 JDBI 中公开 Rx 的东西(例如@hgschmie )。 我不确定对 R2DBC 的“支持”是什么意思。

您是在谈论在 JDBI 之上实现 R2DBC,让 JDBi 消耗 R2DBC Connection s,交换 JDBI 以专注于 Rx 接口,还是……其他?

认为这将是“支持 JDBI 使用的 R2DBC 驱动程序,公开 JDBI 接口”?

R2DBC 是 JDBC 的异步替代品。

@brianm R2DBC 不是线程池上的 JDBC。 R2DBC 意味着两件事:

  1. R2DBC 驱动程序是使用非阻塞传输层为每个 I/O 绑定操作返回org.reactivestreams.Publisher类型的实现。 它们在底层不使用 JDBC 驱动程序,而是从头开始实现有线协议。
  2. R2DBC 是一个标准化的(独立于供应商的)SPI,允许在顶部构建客户端库。 驱动程序实现可以像今天为 JDBC 所做的那样互换。

您是在谈论在 JDBI 之上实现 R2DBC,让 JDBi 使用 R2DBC 连接吗?

是的,这就是它的基本含义。 有一个 R2DBC 特定的 JDBI 模块返回 Project Reactor/RxJava2/Zerodep 类型。

我很确定我明白 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 与 Project Reactor 没有意见,因此我尝试列出使用这两种 API 的变体。

有人可以澄清一下这里提出的究竟是什么吗?

R2DBC 是 JDBC 之上的一层,还是它自己的东西? 因为Jdbi 是和JDBC 耦合到极致的。

R2DBC 不是 JDBC 之上的一层。 R2DBC 是一个用于访问 SQL 数据库的非阻塞 API,它是它自己的东西(R2DBC 驱动程序通常是从头开始编写的,使用非阻塞 I/O 层实现供应商特定的连线协议)。 如果您愿意,R2DBC 是如何与 SQL 数据库集成的反应式规范。

这里的提议是拥有一个外观和工作方式类似于 Jdbi 但在 R2DBC 驱动程序下使用的 API。 API 将返回 Reactive Streams 类型,而不是返回标量对象。

感谢您的澄清。 我希望这里的第一步是对 Jdbi 分支或分支进行原型设计,该分支或分支至少用作 PoC,展示如何在 R2DBC 之上实现上述示例。 从那里我们必须确定一条与现有 JDBC 支持并行集成的路径,或者确定它作为硬分叉会更好。 正如马修在上面指出的,我们目前与 JDBC 紧密耦合,改变它可能既需要大量艰苦的工作,也可能需要破坏性的改变。

我很高兴在项目的长期雷达上有这个,但我不希望它在没有大量社区参与的情况下迅速发展。

@stevenschlansker我们最初创建了受 JDBI 启发的 r2dbc -client 。 您如何看待引入r2dbc模块( jdbi-r2dbc )作为 R2DBC Client 对 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实例“来自”从”那Jdbi也得到他们的配置。 能够执行诸如<strong i="11">@SqlUpdate</strong> CompletableFuture<ResultType> doSomeWork(...);或任何适当的反应类型之类的事情也很好。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

keith-miller picture keith-miller  ·  3评论

buremba picture buremba  ·  5评论

Romqa picture Romqa  ·  5评论

jimmyhmiller picture jimmyhmiller  ·  6评论

rherrmann picture rherrmann  ·  4评论