Nodejs – 如何杀死正在运行的SQLite查询

可能类似的问题:

SQL:中断查询

有没有办法中止SQLite调用?

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

问题是:如果用户在地图上多次点击,发送很多请求到服务器,只有最后一个是重要的。 想象一下,如果一个查询需要5秒的时间来执行,并且用户在地图上每秒钟点击3次(他只想要点击的最后一个位置被使用),那么服务器将执行3个查询, 3信号通过socket.io(并打开3popup,我们只需要最后一个被打开)! 有没有任何解决scheme杀死/中止正在运行的sqlite查询与nodejs?

示例代码:

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" 

我知道,如果有很多用户连接,这将不会像那样工作(我可能需要使用会话来知道哪个用户的function实际上是收集数据)。 但即使只有一个用户,我也找不到任何解决scheme。

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

预先感谢您的回答。

感谢您的答案Qualcuno。

我find了一个解决scheme,使用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) }; });