Node.js oracle驱动程序 - 多个更新

时间:2016-02-24 08:01:03

标签: node.js oracle

所以我设置了一个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;
}

3 个答案:

答案 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没有一个可以在第二次更新时开始(他们完成了第一次更新),所以有些人将有机会继续提交。看起来它们都以某种方式排队。