gpt4 book ai didi

ajax - Nodejs - 如何终止正在运行的 SQLite 查询

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:49 25 4
gpt4 key购买 nike

可能的类似问题:

SQL: Interrupting a query

Is there a way to abort an SQLite call?

大家好,我实际上使用 socket.io 和 sqlite3 模块在 SQLite 数据库上执行 SELECT 查询。当用户点击 OpenLayers map 时,它会向服务器发送信号(通过 socket.io),通过执​​行空间请求(如交集、并集……使用 Spatialite 扩展)来收集信息,然后最终将数据发送回客户端(这些是长时间运行的查询(取决于几何图形的数量)),以在用户点击的 map 上显示一个弹出窗口。

问题是:如果用户在 map 上点击多次,向服务器发送许多请求,那么只有最后一个是重要的。想象一下,如果执行一个查询需要 5 秒,并且用户在一秒内在 map 上单击 3 次(他只想使用他单击的最后一个位置),那么服务器将执行 3 次查询,通过 socket.io 发送回 3 个信号(并打开 3 个弹出窗口,我们只需要打开最后一个)!是否有任何解决方案可以使用 nodejs 终止/中止正在运行的 sqlite 查询?

示例代码:

socket.on('askForInfo', function (data) {
sendInfo(socket, data.latitude, data.longitude);
});

sendInfo 定义:

function sendInfo(socket, lat, lng) {
// Database connection
var db = new sqlite.Database('some file.sqlite', sqlite.OPEN_READONLY);

// Load Spatialite extension
db.loadExtension('mod_spatialite', function(err) {
// Query doing spatial request
db.get("VERY LONG SQL QUERY", function(err, row) {
// Send the data gathered from database
socket.emit('sendData', row['some sql column']);
});
});
}

我想做一些类似的事情:

if ("sendInfo didn't finished to emit any signal through socket"
AND "user did another resquest")
then
"kill all running sendInfo function execution and sql query"

我知道,如果有很多用户连接,这将不会像那样工作(我可能需要使用 session 来知道该函数实际上正在为哪个用户收集数据)。但即使只有一个用户,我也找不到任何解决方案。

我尝试使用 AJAX(jquery) 而不是 socket.io。我可以中止 xhr 请求,但即使请求被中止,SQL 查询仍在运行,直到她完成(无用地使用大量资源)

预先感谢您的回答。

最佳答案

感谢您的回答,Qualcuno。

我找到了一种解决方案,使用 child_process 从另一个进程查询数据库,如果用户发出另一个请求,则杀死这个进程。

var cp = require('child_process');
// more stuff ...

socket.on('askForInfo', function (data) {
// if process is connected, kill it (query isn't terminated)
if (child.connected) {
child.kill();
}

// create a new process executing 'query_database.js'
child = cp.fork('./query_database.js', [
data.latitude, data.longitude
]);

// when invoking [ process.send(some_data_here) ] in child process, fire this event to send data to the user
child.on('message', function(d) {
socket.emit('sendData', d)
};
});

关于ajax - Nodejs - 如何终止正在运行的 SQLite 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27571430/

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