Vertx JDBC 的底层工作原理

2024-04-11

我已经使用 Vertx 3 个月了,但现在我想知道非阻塞 Vertx JDBC 是如何工作的,例如

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

        }
    }

这里我们提供了一个回调,当我们的 select 语句从数据库返回结果时将执行该回调,但它是如何工作的。

我在文档中没有找到答案https://vertx.io/docs/vertx-jdbc-client/java/

在我看来:

Vertx 使用其中一个工作线程执行 select 语句,以不阻塞事件循环线程。但在这种情况下,每个 sql 查询都需要一个单独的线程来执行。 但是,如果 Vertx 不使用任何单独的线程来执行查询,在这种情况下事件循环如何知道结果何时来自数据库,使用线程非常简单,事件循环可以检查 jdbc 查询使用的线程的当前状态,并且如果状态已准备好,则意味着事件循环应该执行回调

我对么?


一般来说,你是对的。
您可以自己在引擎盖下看到:

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

And execute() https://github.com/vert-x3/vertx-jdbc-client/blob/master/src/main/java/io/vertx/ext/jdbc/impl/actions/AbstractJDBCAction.java#L66看起来像这样:

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

您可能想知道在哪里ctx来自。在里面JDBCClientImpl https://github.com/vert-x3/vertx-jdbc-client/blob/master/src/main/java/io/vertx/ext/jdbc/impl/JDBCClientImpl.java#L215:

public SQLClient getConnection(Handler<AsyncResult<SQLConnection>> handler) {
    Context ctx = vertx.getOrCreateContext();
    getConnection(ctx, ar -> ctx.runOnContext(v -> handler.handle(ar)));
    return this;
  }

你的查询是由普通的旧执行的ExecutorService https://github.com/vert-x3/vertx-jdbc-client/blob/master/src/main/java/io/vertx/ext/jdbc/impl/JDBCClientImpl.java#L65

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vertx JDBC 的底层工作原理 的相关文章

随机推荐

  • Zookeeper管理服务器端口

    在Windows上安装了zookeeper 3 5 6 bin 出现错误 无法启动AdminServer 异常退出 org apache zookeeper server admin AdminServer AdminServerExcep
  • 将变量从 Github Action 传递到 Docker 镜像构建

    我一直致力于设置 Github Actions 工作流程来构建 docker 映像 我需要将环境变量传递到图像中 以便我的 Django 项目能够正确运行 不幸的是 当我构建图像时 它没有收到变量的值 我的工作流程文件的相关部分 name
  • 如何通过索引列表过滤 numpy 数组?

    我有一个 numpy 数组 filtered rows 由 LAS 数据组成 x y z intensity classification 我创建了一个cKDTree点并找到最近的邻居 query ball point 这是该点及其邻居的索
  • webview_flutter 和 flutter_webview_plugin 哪个更好

    我已经在flutter中开发了web view 我不清楚哪个更好 webview flutter 与 flutter webview plugin In webview flutter Flutter 小部件可以在 Web 视图上显示 so
  • 如何制作Python模块或函数并在编写其他程序时使用它?

    在很多情况下 我必须在多个程序中一遍又一遍地编写大行代码 所以我想知道是否可以只编写一个程序 保存它 然后在不同的程序 例如函数或模块 中调用它 一个基本的例子 我编写一个程序来检查一个数字是否是回文 然后我想编写一个程序来检查一个数字是否
  • 强调 WordPress 主题 - 添加第二个侧边栏

    使用下划线主题 s 启动 WordPress 网站 我已经有一个侧边栏可以工作 但想在同一页面上制作第二个侧边栏 包含不同的小部件 我已将新的侧边栏添加到functions php 中 它出现在Wordpress 登录屏幕中 我可以将小部件
  • 存储对特定文件的更改

    我有一个大型 git 项目 我愚蠢地将其导入到 eclipse 并运行自动格式 现在 项目中的每个文件都显示为已修改 我宁愿还原所有仅格式化且未进行其他更改的文件 而不是提交格式化的文件 例如 git status On branch ma
  • Python 多处理和处理工人中的异常

    我使用 python 多处理库来实现一种算法 其中有许多工作人员处理某些数据并将结果返回给父进程 我使用 multiprocessing Queue 将作业传递给工作人员 然后收集结果 一切都运行得很好 直到工作人员无法处理某些数据块 在下
  • Opencv Python打开dng格式

    我不知道如何在 opencv 中打开 dng 文件 该文件是在使用三星 Galaxy S7 的专业选项时创建的 使用这些选项时创建的图像是 dng 文件以及尺寸为 3024 x 4032 的 jpg 我相信这也是 dng 文件的尺寸 我尝试
  • MVC3 和 EF 数据优先:最佳实践是什么?

    似乎 MVC3 和 EF4 1 的大部分焦点都围绕 代码优先 我似乎找不到任何满足以下条件的示例或教程 使用现有的 SQLServer 数据库 有单独的网络和数据访问项目 我们将有多个网络应用程序共享相同的数据访问类 验证建议 是否存在这样
  • javascript中的地理空间查询[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我进行地理空间查询 我知道 OpenLayers 和
  • codeigniter、result() 与 result_array()

    我都用result and result array 通常我喜欢将结果作为数组 这就是我主要使用 result array 的原因 但我想知道我应该遵循哪种更好的方法 就性能而言 其中哪一个使用起来更有效 这是我在 codeigniter
  • 如何使用VBA保存分号分隔的csv文件?

    我将数据复制到电子表格中 使用 VBA 对其进行格式化 然后将该工作表保存到 CSV 文件中 我使用以下代码 ws SaveAs Filename filestr Fileformat xlCSV ws 是我保存的工作表 这给了我一个以逗号
  • 在 Symfony2 中将多对多关系保存到数据库

    在我的 Symfony2 项目中 我有两个相关的实体 用户和收藏夹 他们之间是多对多的关系 我的应用程序的工作原理如下 在我的 Twig 页面中 我有一些带有 添加到收藏夹 按钮的项目 当您单击该按钮时 我的控制器会将 item id 保存
  • 无法播放 AVAudioPlayer 中文档中的文件

    我在应用程序的文档文件夹中有一个文件 我想播放它 if NSFileManager defaultManager fileExistsAtPath pathString let url NSURL fileURLWithPath pathS
  • Mac OSX 中的 eclipse 中凭证存储失败

    当我使用 mac 中的 eclipse 和我的凭据连接到 tfs 中的服务器项目时 它的连接没有任何问题 但是当我在登录对话框中检查 保存密码 时 它显示错误 凭据存储失败 无法保存您的凭据 有什么办法可以摆脱这个 因为我不想每次打开 ec
  • LibGDX 文本字段输入导致崩溃

    所以我试图制作一个登录屏幕 现在的问题是 当我在文本字段中输入文本时 我的游戏崩溃了 这是我的主菜单类 import com badlogic gdx Gdx import com badlogic gdx Screen import co
  • 无法对非静态方法进行静态引用

    到目前为止我有以下代码 import java util Scanner public class HallLanceMemoryCalculator private double currentValue public static in
  • window.onload 与 $(document).ready()

    JavaScript 之间有什么区别window onload https developer mozilla org en docs Web API GlobalEventHandlers onload和 jQuery 的 documen
  • Vertx JDBC 的底层工作原理

    我已经使用 Vertx 3 个月了 但现在我想知道非阻塞 Vertx JDBC 是如何工作的 例如 private void selectEndedMatches this jdbcClient getConnection conn gt