Java Vertx JDBC如何在引擎盖下工作

Java Vertx JDBC如何在引擎盖下工作,java,asynchronous,jdbc,vert.x,Java,Asynchronous,Jdbc,Vert.x,我已经使用Vertx 3个月了,但现在我想知道非阻塞VertXJDBC是如何工作的,例如 private void selectEndedMatches(){ this.jdbcClient.getConnection(conn->{ if(conn.failed()){ log.error("Can't get Vertx connection",conn.cause()); } else{

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

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

        }
    }
private void selectEndMatches(){
这个.jdbclient.getConnection(conn->{
如果(连接失败()){
log.error(“无法获取Vertx连接”,conn.cause());
}否则{
最终SQLConnection连接=连接结果();
connection.queryWithParams(“从get5_stats_matches中选择matchid,其中matchid>和end_time不为空”),new JsonArray().add(this.lastMatchId),this::EnddMatches);
connection.close();
}
});
}
私有void endedMatches(最终异步结果){
如果(rs.failed()){
log.error(“无法从JdbcVerticle生成select语句”,rs.cause());
}否则{
最终列表结果=rs.result().getResults();
final List endedMatches=新的ArrayList(results.size());
用于(最终JsonArray结果:结果){
add(result.getInteger(0));
}
}
}
在这里,我们提供了一个回调,当select语句从DB返回结果时将执行该回调,但它是如何工作的

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

我认为:

Vertx使用一个工作线程来执行select语句,以不阻止事件循环线程。但在这种情况下,每个sql查询都需要一个单独的线程来执行。 但如果Vertx不使用任何单独的线程来执行查询,在本例中,事件循环如何知道结果何时来自DB,使用线程这很简单,事件循环可以检查jdbc查询使用的线程的当前状态,如果状态就绪,则意味着事件循环应该执行回调


我说的对吗?

非阻塞Vertx JDBC是如何工作的?要知道这个答案,你需要深入了解vertx文档和非阻塞理论

让我们谈谈你的代码

connection.close()

这行代码不是必需的。Vertx将按照其文档进行处理

使用vertx,当我们使用JDBC执行查询时,我们可以做以下两件事:

  • 打开连接,按顺序执行多个查询,最后关闭连接,这是阻塞代码
  • 打开连接,执行单个查询,然后关闭连接,如果我们不认真关闭连接,这是一种令人头痛的编码方式
  • 现在,让我们分析非阻塞VertxJDBC的工作原理。
    如果我们更关注点2的关闭,即打开连接,则执行单个查询,然后关闭连接。如果我们并行执行,并认真处理vertx已经处理过的关闭连接,那么我们已经实现了不完全但近似的无阻塞查询执行

    一般来说,您是正确的。
    你可以在引擎盖下面看到:

    方法
    queryWithParams()
    调用
    execute()

    您可能想知道
    ctx
    从何而来。它在:


    publicsqlclientgetconnection(Handler

    非常感谢,你帮了我解决了大部分与Vertx相关的问题,但我可以请你再问一个问题,不要创建不同的主题吗。据我所知,Vertx中的所有阻塞调用都是使用线程池实现的,但据我所知,Vertx使用Netty-under-the-hood,这意味着更少的线程和更高的生产率,但在Vertx中,我使用了dn看不出它如何在没有线程池的情况下使用blockig IO。Netty仅用于网络部分。阻塞调用通常来自
    java.util.concurrent
    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;
      }
    
    public void execute(Connection conn, TaskQueue statementsQueue, Handler<AsyncResult<T>> resultHandler) {
        ctx.executeBlocking(future -> handle(conn, future), statementsQueue, resultHandler);
    }
    
    public SQLClient getConnection(Handler<AsyncResult<SQLConnection>> handler) {
        Context ctx = vertx.getOrCreateContext();
        getConnection(ctx, ar -> ctx.runOnContext(v -> handler.handle(ar)));
        return this;
      }