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));
}
});
}
我正在生成一个值(使用 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));
}
});
}