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

时间:2018-05-08 04:08:34

标签: java vert.x

我正在生成一个值(使用uuid java的6个字母数字字母)并在数据库已经存在的情况下再次检查它。如果该值已经存在于db中,则生成新值并再次检查该值是否存在(依此类推)。以同步方式(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
  }
});

我无法将上面的代码放在我的方法上,因为它是异步执行的,所以我的方法总是返回true / false(基于初始赋值)。如何(可能)在vertx中进行数据库查询循环?

1 个答案:

答案 0 :(得分:3)

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

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