当前位置: 首页 > 知识库问答 >
问题:

在R2DB中,处理表中的所有行是阻塞还是锁定?

钱德元
2023-03-14

以下构造是否以任何可能的方式阻塞或锁定?这是使用R2DB的正确方式吗?否则,如何以被动方式处理表中的所有记录?

我关心的是在整个流量消耗之前数据库连接、表和Reactor线程发生了什么。如果我正在阻塞线程,或者我保持表锁定,或者数据库连接被阻塞。

目的是写一个表中所有行的批处理。对于每一行,我都要执行一个活动,该活动包括从外部web服务获取数据,并最终在同一个表中覆盖原始发票。

假设单行处理方法(在本例中为< code > recalculate invoice())是完全反应式的。

import org.springframework.r2dbc.core.DatabaseClient;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Mono;
import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class DbConnector {
    private final DatabaseClient databaseClient;

    public Mono<Void> batchProcessing() {
        return databaseClient
                .sql("SELECT * FROM invoice")
                .fetch()
                .all()
                .delayElements(Duration.ofSeconds(10)) 
                // a costly operation with the data ...
                .then()
        ;
    }
}

共有1个答案

戚澄邈
2023-03-14

您的代码段是完全被动的。它不会阻塞任何线程或数据库。这就是使用 R2DBC 的整个想法。

在幕后,R2DBC驱动程序将执行类似这样的操作:

Flux.usingWhen(connectionFactory.create(),
        connection -> 
            Flux.from(connection.createStatement("SELECT * FROM invoice").execute()),
        Connection::close);

一旦管道完成或出现错误,数据库连接将立即关闭。

您可以在此处阅读有关如何对此类查询应用背压的信息。

 类似资料:
  • 我有一个顶点,它有一个处理程序,可以在事件循环线程中调用Vertx的Web客户端。实际的底层API调用是同步的还是异步的?它会阻塞我的事件循环线程吗?假设我的API调用需要30秒才能返回。 我是否需要用Vertx.execute阻塞(p-

  • 我对JPA中乐观锁定的好处有点困惑。 我在版本化实体表上用两个线程和一行进行了测试。 这是我的发现: 第二次测试。请注意select语句的添加。 我真的没想到在使用乐观锁定时会发生任何阻塞,但是我的理解是,这里必须有一个数据库事务,以便从 select 语句返回正确的数据。 由于JPA似乎只在绝对必要时输入数据库事务,谁能解释一下乐观锁定的好处是什么?

  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 我想澄清这一点,因为文件对这一点不太清楚; 问题1:是顺序或并行处理所有promise?或者,更具体地说,它是否等同于运行像这样的连锁promise 或者是另一种算法,所有的,,,,,等等都同时被调用(并行),并且在所有解析(或一个拒绝)后立即返回结果? 问题2:如果都是并行运行的,有没有一种方便的方法可以依次运行iterable? 注意:我不想使用Q或Bluebird,而是所有原生ES6规范。

  • 问题内容: 对于此代码段。我的问题是“ invokeAll()是否是阻塞调用”?我的意思是,当代码运行到invokeAll()行时,我们是否在此等待所有生成的结果? 问题答案: 执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。 Future.isDone()对于返回列表的每个元素为true。 请注意,已完成的任务可能已正常终止,也可能引发异常。如果在进行此操作时修改了给定的集合,

  • 本文向大家介绍怎样确定当前线程是繁忙还是阻塞?相关面试题,主要包含被问及怎样确定当前线程是繁忙还是阻塞?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 使用ps命令查看