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

Vertx JDBC的工作原理

刘意
2023-03-14
private void selectEndedMatches(){
        this.jdbcClient.getConnection(conn->{
            if(conn.failed()){
                log.error("Can't get Vertx connection",conn.cause());
            } else{
                final SQLConnection connection = conn.result();
                connection.queryWithParams("select matchid from get5_stats_matches where matchid > ? and end_time is not null",new JsonArray().add(this.lastMatchId),this::endedMatches);
                connection.close();
            }
        });
    }


private void endedMatches(final AsyncResult<ResultSet> rs) {
        if(rs.failed()){
            log.error("Can't make select statement from JdbcVerticle",rs.cause());
        } else{
            final List<JsonArray> results = rs.result().getResults();
            final List<Integer> endedMatches = new ArrayList<>(results.size());
            for (final JsonArray result : results) {
                endedMatches.add(result.getInteger(0));
            }

        }
    }

Vertx使用一个辅助线程来执行select语句,以避免阻塞事件循环线程,但是在这种情况下,每个sql查询都需要一个单独的线程来执行。但是如果Vertx不使用任何单独线程来执行查询呢?在这种情况下,事件循环如何知道结果何时来自DB呢?使用线程就很简单了,事件循环可以检查jdbc查询使用的线程的当前状态,如果状态准备就绪,就意味着事件循环应该执行回调

我说得对吗?

共有1个答案

郜卓君
2023-03-14

总的来说,你是正确的。
你自己可以看到引擎盖下面:

方法querywithparams()调用execute():

public SQLConnection queryWithParams(String sql, JsonArray params, Handler<AsyncResult<ResultSet>> resultHandler) {
    new JDBCQuery(vertx, helper, options, ctx, sql, params).execute(conn, statementsQueue, resultHandler);
    return this;
  }

execute()如下所示:

public void execute(Connection conn, TaskQueue statementsQueue, Handler<AsyncResult<T>> resultHandler) {
    ctx.executeBlocking(future -> handle(conn, future), statementsQueue, resultHandler);
}

您可能想知道ctx来自哪里。它位于jdbcclientimpl中:

public SQLClient getConnection(Handler<AsyncResult<SQLConnection>> handler) {
    Context ctx = vertx.getOrCreateContext();
    getConnection(ctx, ar -> ctx.runOnContext(v -> handler.handle(ar)));
    return this;
  }
 类似资料:
  • 一、mitmproxy的工作原理 Mitmproxy是一种非常灵活的工具。准确了解代理过程的工作原理将有助于您创造性地部署代理,并考虑其基本假设以及如何解决这些假设。本文档详细介绍了mitmproxy的代理机制,从最简单的未加密显式代理开始,到最复杂的交互操作-在存在服务器名称指示的情况下,对受TLS保护的流量进行透明的代理。 二、显式HTTP 配置客户端以使用mitmproxy作为显式代理是拦截

  • 本文向大家介绍Tensorflow的工作原理相关面试题,主要包含被问及Tensorflow的工作原理时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Tensorflow是用数据流图来进行数值计算的,而数据流图是描述有向图的数值计算过程。在有向图中,节点表示为数学运算,边表示传输多维数据,节点也可以被分配到计算设备上从而并行的执行操作。

  • JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。 全局范围内 this; 当在全部范围内使用 this,它将会指向全局对象。 译者注:浏览器中运行的 JavaScript 脚本,这个全局对象是 window。 函数调用 foo(); 这里 this 也会指向全局对象。 ES5 注意: 在严格模式下(strict mod

  • ElasticSearch的工作原理 接下来简单了解一下ElasticSearch的工作原理。 启动过程 当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示 在集群中,一个节点被选举成主节点(master node)。这个节点负责管理集群的状态,当群集的拓扑结构改变时把索引分片分派到相

  • 1、Register、Gateway、BusinessWorker进程启动 2、Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己 3、Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中 4、Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给Business

  • 工作原理 FIS3 是基于文件对象进行构建的,每个进入 FIS3 的文件都会实例化成一个 File 对象,整个构建过程都对这个对象进行操作完成构建任务。以下通过伪码来阐述 FIS3 的构建流程。 构建流程 fis.release = function (opt) { var src = fis.util.find(fis.project.root); var files = {}; s

  • IoT 客户端框架 Azure IoT 中心为了方便设备连接提供了丰富的连接协议,如 MQTT、HTTP 等,同时 Azure IoT 中心只支持安全连接。与 IoT 中心的连接由设备客户端来完成,每一个连接到 IoT 中心的设备都会创建一个 IoT 中心客户端实例,当连接关闭时,将这个实例释放掉即可。 IoT 中心客户端会向下调用 LL 层来完成工作,LL 层向下对接不同通信协议的传输层,传输层

  • WebClient 软件包主要用于在嵌入式设备上实现 HTTP 协议,软件包的主要工作原理基于 HTTP 协议实现,如下图所示: HTTP 协议定义了客户端如何从服务器请求数据,以及服务器如何把数据传送给客户端的方式。HTTP 协议采用了请求/响应模型。 客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版