vertx 中的数据库查询循环以检查值是否存在

Database query loop in vertx to check if value exists

我正在生成一个值(使用 uuid java 的 6 个字母数字字母)并再次检查数据库是否该值已经存在。如果该值已存在于数据库中,我将生成新值并再次检查该值是否存在(依此类推)。以同步方式(java),我可以这样做:

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

请注意,this.valuexists 方法检查数据库中是否存在该值然后 return 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
  }
});

我不能将上面的代码放在我的方法中,因为它是异步执行的,所以我的方法总是 return 真/假(基于初始分配)。如何(可能)在vertx中进行数据库查询循环?

您可以将逻辑放在一个方法中,该方法会再次调用自身,直到找不到匹配的行:

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