所以我设置了一个node.js后端,用于移动仓库中的物理项目。托管我们软件的数据库是oracle,我们这个Web应用程序的旧版本是用PHP编写的,工作正常,但有一些奇怪的故障,并且很慢。
node.js后端适用于移动单个项目,但是一旦我尝试移动一个框(然后将移动20-100个项目),整个后端将停在.commit()部分。
任何人都知道为什么会发生这种情况,以及我可以采取哪些措施来解决这个问题?对于故障排除的建议也是非常受欢迎的!
代码:
function move(barcode,location) {
var p = new Promise(function(resolve,reject) {
console.log("Started");
exports.findOwner(barcode).then(function(data) {
console.log("Got data");
// console.log(barcode);
var type = data[0];
var info = data[1];
var sql;
sql = "update pitems set location = '"+location+"' where barcode = '"+barcode+"' and status = 0"; // status = 0 is goods in store.
ora.norway.getConnection(function(e,conn) {
if(e) {
reject({"status": 0, "msg": "Failed to get connection", "error":e});
}
else {
console.log("Got connection");
conn.execute(sql,[],{}, function(err,results) {
console.log("Executed");
if(err) {
conn.release();
reject({"status": 0, "msg": "Failed to execute sql"+sql, "error": err});
}
else {
console.log("Execute was successfull"); // This is the last message logged to the console.
conn.commit(function(e) {
conn.release(function(err) {
console.log("Failed to release");
})
if(e) {
console.log("Failed to commit!");
reject({"status": 0, "msg": "Failed to commit sql"+sql, "error": e});
}
else {
console.log("derp6");
resolve({"status": 1, "msg": "Relocated "+results.rowsAffected+" items."});
}
});
}
});
}
});
});
});
return p;
}
答案 0 :(得分:1)
请注意,您的代码对SQL注入漏洞持开放态度。自从你在网上发布以来更是如此。 ;)
我建议您将语句更新为以下内容:
update pitems
set location = :location
where barcode = :barcode
and status = 0
然后按如下所示更新你的conn.execute:
conn.execute(
sql,
{
location: location,
barcode: barcode
},
{},
function(err,results) {...}
);
Oracle自动转义绑定变量。但是另一个优点是,当绑定变量的值发生变化时,你将避免硬分析。
此外,我很高兴探讨您在提交时遇到的问题。但是如果你能提供一个我可以运行的可重复的测试用例,那将会非常有帮助。
答案 1 :(得分:0)
我认为这是数据库级别的问题,可能不允许在不提供ID的情况下更新多个项目。
你应该做两件事:
1)出于调试目的,将console.log(JSON.stringify(error))添加到您希望出错的位置。然后,您将找到数据库提供的错误
2)在说
的那一行 conn.release(function(err) {
console.log("Failed to release");
})
检查是否定义了错误:
conn.release(function(err) {
if(err){
console.log("Failed to release");
}
else{console.log("conn released");}
})
答案 2 :(得分:0)
这听起来像是我遇到的一个问题。使用oracledb库更新oracle db时,Node.js挂起。它看起来像有167个更新,它工作正常。当我有168次更新时程序会挂起。该计划的结构如下:
当来自本地sqlite db的168条记录时,从sqlite回复的每条记录作为回调:1。)获得Oracle连接; 2.)对两个表执行2次更新(每个表更新一次,后者执行autoCommit)。所有第一次更新已完成,但没有人可以开始第二次更新他们只是挂在那里。有167条记录,它们将完成。
观察到的奇怪的是,168没有一个可以在第二次更新时开始(他们完成了第一次更新),所以有些人将有机会继续提交。看起来它们都以某种方式排队。