【发布时间】:2018-10-30 02:59:53
【问题描述】:
我已经使用 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 语句从 DB 返回结果时会执行该回调,但它是如何工作的。
我在文档 https://vertx.io/docs/vertx-jdbc-client/java/ 中没有找到答案
在我看来:
Vertx 使用其中一个工作线程执行 select 语句以不阻塞事件循环线程。但是在这种情况下,每个 sql 查询都需要一个单独的线程来执行。 但是如果 Vertx 不使用任何单独的线程来执行查询怎么办,在这种情况下,事件循环如何知道结果何时来自 DB,使用线程非常简单,事件循环可以检查 jdbc 查询使用的线程的当前状态,并且如果状态已准备好,则意味着事件循环应该执行回调
我说的对吗?
【问题讨论】:
标签: java asynchronous jdbc vert.x