如何使用Node.js处理Oracle数据库中的许多结果行

时间:2019-06-17 16:24:18

标签: node.js oracle node-oracledb

我正在查询oracle数据库,但结果行很多,因此出现 JavaScript堆内存不足错误。

是否有一种方法可以批量处理查询结果,或者是否有某种方法可以解决内存不足错误?

1 个答案:

答案 0 :(得分: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.log("stream 'error' event");
      console.error(error);
      return;
    });

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

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

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

您可能会将结果流式传输到文件或HTTP响应对象。无论哪种情况,您都可能需要适当的JSON,而不是驱动程序返回的单个行。请查看此问题,以获取有关如何执行此操作的示例: https://github.com/oracle/node-oracledb/issues/908#issuecomment-390006986