Цикл запроса к базе данных в vertx, чтобы проверить, существует ли значение - PullRequest
0 голосов
/ 08 мая 2018

Я генерирую значение (6 буквенно-цифровых букв с использованием uuid java) и проверяю его снова в базе данных, если значение уже существует. Если значение уже существует в БД, я генерирую новое значение и снова проверяю наличие значения (и так далее). Синхронно (Java) я могу сделать это:

String voucher = this.genereatevoucher();
while(this.valuexists(voucher )){
     test = this.genereatevoucher();
}

Обратите внимание, что метод this.valuexists проверяет, существует ли значение в базе данных, затем возвращает true или false. Но в Vertx, общий способ запроса базы данных:

client.getConnection(res -> {
  if (res.succeeded()) {

    SQLConnection connection = res.result();

    connection.query("SELECT * FROM some_table", res2 -> {
      if (res2.succeeded()) {

        ResultSet rs = res2.result();
        // Do something with results
      }
    });
  } else {
    // Failed to get connection - deal with it
  }
});

Я не могу поместить приведенный выше код в мой метод, потому что он выполняется асинхронно, поэтому мой метод всегда будет возвращать истину / ложь (на основе начального присваивания). Как (возможно) сделать цикл запросов к базе данных в vertx?

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете поместить логику в метод, который вызывает себя снова, пока не будет найдено подходящей строки:

generateVoucher(handler);

Где handler - это код, который вы хотите вызвать, когда не найдено ни одной подходящей строки или если запрос к базе данных не выполнен.

Тогда реализация метода выглядит так:

private void generateVoucher(Handler<AsyncResult<String>> handler) {
  String myId = ....;
  client.getConnection(res -> {
    if (res.succeeded()) {
      SQLConnection connection = res.result();
      connection.queryWithParams(myQuery, new JsonArray().add(myId), res2 -> {
        if (res2.succeeded()) {
          ResultSet rs = res2.result();
          boolean inDb = checkAlreadyInDb(rs);
          connection.close();
          if (inDb) {
            generateVoucher(handler);
          } else {
            handler.handle(Future.succeededFuture(myId));
          }
        } else {
          handler.handle(Future.failedFuture(res2.cause));
        }
      });
    } else {
      handler.handle(Future.failedFuture(res.cause));
    }
  });
}
...