gpt4 book ai didi

java - 在 Vertx (Vert.x 3) 中异步运行多个 Sql 查询

转载 作者:行者123 更新时间:2023-11-28 23:28:28 25 4
gpt4 key购买 nike

我正在使用 vertx-mysql-postgresql-client-3.3.0 和 vertx-sql-common-3.3.0我最初想到使用 Batch 操作插入多条语句,但看起来像这样( http://vertx.io/docs/vertx-sql-common/java/#_batch_operations )在 vertx-mysql-postgres-client 中没有实现。

处理 post 数据到 db 的代码是:

SQLConnection sqlConnection;
List <JsonArray> targetParams = new ArrayList();
for (String key : targetObject.getTargets().keySet()) {
targetParams.add(new JsonArray().add(key).add(targetObject.getTargets().get(key)).add(targetObject.getId()));
}
int[] i = {targetObject.getTargets().size()};
while(i[0]>=0) {
sqlConnection.updateWithParams("INSERT INTO Targets (name, id,language) VALUES (?,?,?)", taglineParams.get(i[0] - 1), result ->
{
if (result.succeeded()) {
i[0]--;
}

else { badRequest(context, "Error inserting error code: " + result.cause().toString());
}
});
}

AsyncResult 处理程序代码:

Handler<AsyncResult<SQLConnection>> sqlConnectionHandler = new Handler<AsyncResult<SQLConnection>>() {
@Override
public void handle(AsyncResult<SQLConnection> res) {
if (res.succeeded()) {
sqlConnection = res.result();
} else {
logger.error("Unable to create SQL connection: " + res.cause().toString());
}
}
};

这个不起作用,在第一次插入后会出现 Thread Blocked 错误。

知道如何使多个插入工作吗?

最佳答案

Vert.x 是一个异步框架,但代码使用的是同步结构,无法正常工作。有一个 while 循环,直到变量大于 0。但是对控制变量的更新是在异步处理程序上更新的,这意味着它不会在循环内调用。

知道这个循环将“永远”运行,直到 JVM 线程调度程序将停止它以运行其他线程(最终将更新控制变量)。现在调度程序已经停止了线程,Vert.x 也会通知您您阻塞了事件循环,这意味着您应该修改代码。

我建议要么将 SQL 语句连接到大 sql 语句中并立即执行,要么使用 for 循环。请注意,for 循环也不是 100% 安全的。假设您要插入 100 万行,您也可以轻松使用超过 2 秒的 CPU 时间,并且您会再次收到警告。

好的解决方案是异步循环或以 RX 为例。

关于java - 在 Vertx (Vert.x 3) 中异步运行多个 Sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38295740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com