2017-01-12 17 views
1

私は約40のOracle接続/照会を実行するnodejsアプリケーションを持っています。私はasyncを使用して、proposed solution hereからの非同期呼び出しを制限しています。私の問題は、関数/クエリが完了する前にドレインコールバックが実行され、完了していることです。どんな助けでも大歓迎です。完了までのNodejs非同期コール・コール・コールバック

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(); 
} 
+0

ようこそStackOverflow。 'oracledb.getConnection'の呼び出しが非同期で終了する可能性はありますか?もしそうなら、 'runAsyncCallout'が起動し、' oracledb.getConnection'を呼び出すと、それが実行されますが、その間に 'runAsyncCallout'は引き続き実行され、実際のクエリが実行される前に呼び出し元に戻ります。 – akousmata

答えて

0

私は短い答えは、あなたのコールバック(キューから渡された)が間違った場所にあると思います。その時点でコールバックを呼び出すことは、キューに「やあ、そのことでやった!」と伝えるようなものです。

Oracleで作業をコミットして接続を解除するまで、実際には「コールアウト」の処理は完了していません。 connection.releaseまたはconnection.closeに渡されたコールバック内でコールバックを呼び出すことをお試しください(使用している方)。ここで

は、他のいくつかのヒント/提案です:接続プールへの一回限りの接続から

  1. スイッチ。ドライバはinternal pool cacheで複数の名前付きプールをサポートするようになりましたので、使い方は簡単です。
  2. 複数の往復から一括処理に切り替える。確かに、これはJavaScriptとPL/SQLの経験によっては難しいですが、好きな場合は例を挙げることができます。
+0

ありがとう、これは私のために働いた。私はあなたの2つの他の提案を探そう:) – Kochaloch

関連する問題