Я использую 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, чтобы не блокировать поток цикла Event.But. Но в этом случае для каждого SQL-запроса требуется отдельный поток для выполнения.Но что, если Vertx не использует какой-либо отдельный поток для выполнения запроса, в этом случае, как цикл обработки событий узнает, когда результат поступил из БД, используя потоки, это довольно просто, цикл обработки событий может проверить текущее состояние потока, который используется запросом jdbc, иесли состояние готово, это означает, что цикл обработки событий должен выполнить обратный вызов
Правильно ли я?