Как обрабатывать множество строк результатов в базе данных Oracle с помощью Node, js

Я делаю запрос к базе данных оракула, но есть много строк результатов, поэтому я получаю ошибку Недостаточно памяти для JavaScript-кучи.

Есть ли способ обработать результат запроса пакетно или что-то еще, чтобы не получить эту ошибку нехватки памяти?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 897
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не указали, но я предполагаю, что вы используете node-oracledb. Если это так, то хитрость заключается в использовании объекта ResultSet. Это обеспечит согласованное чтение данных (одновременное представление данных с момента запуска запроса), позволяя при этом передавать данные по сети: https://oracle.github.io/node-oracledb/doc/api.html#streamingresults

Вот пример, в котором используется экземпляр QueryStream. Класс QueryStream — это всего лишь оболочка для ResultSet для предоставления потоковых API.

var oracledb = require('oracledb');
var dbConfig = require('./dbconfig.js');

var rowcount = 0;

oracledb.getConnection(
  {
    user          : dbConfig.user,
    password      : dbConfig.password,
    connectString : dbConfig.connectString
  },
  function(err, connection) {
    if (err) {
      console.error(err.message);
      return;
    }

    var stream = connection.queryStream(
      'SELECT first_name, last_name FROM employees ORDER BY employee_id',
      [],  // no binds
      { fetchArraySize: 150 }  // internal buffer size for performance tuning
    );

    stream.on('error', function (error) {
      // console.info("stream 'error' event");
      console.error(error);
      return;
    });

    stream.on('metadata', function (metadata) {
      // console.info("stream 'metadata' event");
      console.info(metadata);
    });

    stream.on('data', function (data) {
      // console.info("stream 'data' event");
      console.info(data);
      rowcount++;
    });

    stream.on('end', function (metadata) {
      // console.info("stream 'end' event");
      stream.destroy();  // the stream should be closed when it has been finished
    });

    stream.on('close', function () {
      // console.info("stream 'close' event");
      console.info('Rows selected: ' + rowcount);
      connection.close(  // Note: do not close connections on 'end'
        function(err) {
          if (err) {
            console.error(err.message);
          }
        });
    });
  });

Вы, вероятно, собираетесь передавать результаты в файл или объект ответа HTTP. В любом случае вам, скорее всего, понадобится правильный JSON, а не отдельные строки, которые возвращает драйвер. Взгляните на этот вопрос для примера того, как вы можете это сделать: https://github.com/oracle/node-oracledb/issues/908#issuecomment-390006986

Вы также можете использовать ResultSet с getRow() или getRows(), если вы не хотите использовать Stream. Проверьте Примеры — посмотрите на resultset1.js и resultset2.js.

Christopher Jones 18.06.2019 06:29

Другие вопросы по теме