gpt4 book ai didi

mysql - 如何在不中断连接的情况下在 node.js mysql 中使用递归?

转载 作者:可可西里 更新时间:2023-11-01 07:30:29 25 4
gpt4 key购买 nike

我正在使用 iojs 和 node-mysql。这是我第一次涉足异步服务器端编程。它本质上是一个批处理作业:全部运行一次,然后退出。我特别想在一张满是修订版的 table 上这样做:

过去一年编辑的每份文件;过去一年对该文件的每次修订;获取之前的修订版并将其内容与当前修订版进行比较。

因此,我使用一个查询(针对每个文档)的结果来触发任意数量的额外查询(针对每个修订),这些查询本身必须递归(获取之前的修订)。

我不知道如何关闭数据库连接。据我所知,递归是混淆因素:如果我从代码中删除它,那么我可以关闭数据库连接。但我需要递归。

这是一个实现我在程序中看到的行为的最小示例(假设要求和配置正常)。

var con = mysql.createConnection(db_config);
con.connect();

con.query('SELECT field_2 FROM test_table', function(err, rows) {
if (err) throw err;
rows.forEach(function(row) {
second_query(row.field_2);
});

// using this here works if there is no recursion, even if second_query runs long
// using this here does not work if there is recursion
// removing this allows the program to run to completion, but the event loop never exits
con.end()
});

function second_query(key) {
con.query('SELECT * FROM test_table_2 WHERE field_2 > ?', [key], function(err, rows) {
if (err) throw err;
if (rows.length > 0) {
rows.forEach(function(row) {
console.log(row.field_2);
});
second_query(key + 1);
}
});
}

我非常努力地尝试通过在累加器中注册数据库查询并在每次查询结束时递减累加器来解决这个问题,但这还没有产生可预测的成功,并且使代码难以使用。

最佳答案

对于这种类型的工作负载,我喜欢 async.queue。您可以免费获得可微调的并发性,但使用并发性 1 进行调试总是最容易的。

var mysql = require("mysql");

// concurrency 1. Adjust to taste once it's working
var queue = require("async").queue(secondQuery, 1);
var dbOptions = {
host: process.env.DOCKER_IP,
database: "hoosteeno",
user: "root",
password: "password"
};
var con = mysql.createConnection(dbOptions);
con.connect();

con.query("SELECT field_2 FROM test_table", function (error, rows) {
if (error) throw error;
rows.forEach(function (row) {
queue.push(row.field_2);
});
});

function secondQuery (key, callback) {
var sql = "SELECT * FROM test_table_2 WHERE field_2 > ?";
con.query(sql, [key], function (error, rows) {
if (error) {
callback(error);
return;
}
if (rows.length > 0) {
rows.forEach(function (row) {
console.log(row.field_2);
});
queue.push(key + 1);
}
callback();
});
}

queue.drain = function () {
con.end();
};

关于mysql - 如何在不中断连接的情况下在 node.js mysql 中使用递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29990452/

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