【问题标题】:Nodejs async calling drain callback before complete完成前Nodejs异步调用排水回调
【发布时间】:2017-05-28 03:09:39
【问题描述】:

我有一个运行大约 40 个 oracle 连接/查询的 nodejs 应用程序。我正在使用 async 来限制来自proposed solution here 的异步调用。我的问题是在我的函数/查询完成之前排水回调正在运行和完成。非常感谢任何帮助。

var queue = async.queue(runAsyncCallout, 5); 

        queue.concurrency = 5; 

        db.collection('callout').find({'active':0}).each(function(error, callout) {

             queue.push(callout);

        });

        queue.drain = function() {
            db.collection('callout_lock').update({'context': 'ALL_CALLOUTS'}, {$set: {'lock': '0'}});
            db.collection('callout_lock').update({'context': 'ALL_CALLOUTS'}, {$set: {'date': time_stamp}});
            console.log("All callouts done unlocking");
        };
        queue.concurrency = 5;


function runAsyncCallout(callout, callback) {

    switch(callout.db_connect){//Grab connection profiles

        case "A":
            connAttrs=A;
            break;
        case "B":
            connAttrs=B;
            break;
        case "C":
            connAttrs=C;
            break;
        default:
            connAttrs=D;
    }


    oracledb.getConnection(connAttrs, function (e, connection) {


            connection.execute(callout.query, {}, {
                outFormat: oracledb.OBJECT
            }, function (e, result) {

                //Sparing the details here, run oracle query and save to mongodb

                doRelease(connection);



            });


    });

callback();
}

【问题讨论】:

  • 欢迎来到 StackOverflow。是否有可能调用oracledb.getConnection 是异步完成的?如果是这样,runAsyncCallout 会触发,调用oracledb.getConnection,然后它会去做它的事情,但与此同时runAsyncCallout 会继续并可能在实际查询执行之前返回给调用者。

标签: node.js asynchronous


【解决方案1】:

我认为简短的回答是您最后的回调(从队列中传递)位于错误的位置。那时调用回调就像告诉队列,“嘿,完成了那件事,下一个!”

在您在 Oracle 中提交您的工作并释放连接之前,您并没有真正完成处理“标注”。尝试在传递给connection.release 或connection.close(无论您使用哪个)的回调中调用回调。

以下是一些其他提示/建议:

  1. 从一次性连接切换到连接池。该驱动程序现在支持internal pool cache 中的多个命名池,因此非常易于使用。
  2. 从多次往返切换到批量处理。当然,这取决于您对 JavaScript 和 PL/SQL 的经验,但如果您愿意,我可以提供一个示例。

【讨论】:

  • 非常感谢,这对我有用。我将探讨您的另外两个建议:)
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2017-05-15
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多