1

私は node-oracledb を数か月使用してきましたが、これまでに必要だったことを達成することができました。

私は現在、1 回の呼び出しで約 200 万行のデータを返す可能性のある検索アプリに取り組んでいます。ブラウザとサーバーから切断されないようにするために、queryStream を試して、クライアントに一定のデータ フローが返されるようにしようと考えました。

queryStreamの例をそのまま実装したところ、数十万行で問題なく動作しました。ただし、返された行が 100 万を超えると、Node はメモリ不足になります。クライアントとサーバーの両方のログ イベントをログに記録して監視することで、送受信された行に関して、クライアントがサーバーよりもかなり遅れていることがわかります。つまり、大量のデータをバッファリングしているため、ノードが倒れているように見えます。

この時点で、selectstream の実装は Express 経由で呼び出される req/res 関数内にあることに注意してください。

データを返すには、次のようにします....

stream.on('data', function (data) {

    rowcount++;

    let obj = new myObjectConstructor(data);
    res.write(JSON.stringify(obj.getJson());

});

ストリームとパイプがフローにどのように役立つかについて読んできたので、私ができるようにしたいのは、クエリからの結果を a) フローを支援し、b) できるようにすることです。クライアントに送り返す前に、結果を他の関数にパイプします。

例えば

function getData(req, res){

    var stream = myQueryStream(connection, query);

    stream
        .pipe(toSomeOtherFunction)
        .pipe(yetAnotherFunction)
        .pipe(res);

}

結果をパイプできるようにする解決策または例を見つけるのに数時間費やしましたが、行き詰まっており、助けが必要です。

明らかな何かが欠けている場合は申し訳ありませんが、ノード、特にストリームについてはまだ把握しています。

前もって感謝します。

4

2 に答える 2