如何使用 Node.js 处理 Oracle 数据库中的大量结果行
How to handle a lot of result rows in Oracle Database with Node,js
我正在对 oracle 数据库进行查询,但有很多结果行,所以我收到 JavaScript 堆内存不足 错误。
有没有办法批量处理查询结果或避免出现内存不足错误?
你没有指定,但我猜你正在使用 node-oracledb。如果是这样,那么诀窍就是使用 ResultSet 对象。这将提供数据的 read-consistent 视图(从查询开始时起的数据的单个时间点视图),同时允许您通过网络流式传输数据:
https://oracle.github.io/node-oracledb/doc/api.html#streamingresults
下面是一个使用 QueryStream 实例的示例。 QueryStream class 只是 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 (metadata) {
// console.log("stream 'end' event");
stream.destroy(); // the stream should be closed when it has been finished
});
stream.on('close', function () {
// console.log("stream 'close' event");
console.log('Rows selected: ' + rowcount);
connection.close( // Note: do not close connections on 'end'
function(err) {
if (err) {
console.error(err.message);
}
});
});
});
您可能会将结果流式传输到文件或 HTTP 响应对象。在任何一种情况下,您都可能需要适当的 JSON 而不是驱动程序 returns 的个别行。查看此问题以了解如何执行此操作的示例:
https://github.com/oracle/node-oracledb/issues/908#issuecomment-390006986
我正在对 oracle 数据库进行查询,但有很多结果行,所以我收到 JavaScript 堆内存不足 错误。
有没有办法批量处理查询结果或避免出现内存不足错误?
你没有指定,但我猜你正在使用 node-oracledb。如果是这样,那么诀窍就是使用 ResultSet 对象。这将提供数据的 read-consistent 视图(从查询开始时起的数据的单个时间点视图),同时允许您通过网络流式传输数据: https://oracle.github.io/node-oracledb/doc/api.html#streamingresults
下面是一个使用 QueryStream 实例的示例。 QueryStream class 只是 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 (metadata) {
// console.log("stream 'end' event");
stream.destroy(); // the stream should be closed when it has been finished
});
stream.on('close', function () {
// console.log("stream 'close' event");
console.log('Rows selected: ' + rowcount);
connection.close( // Note: do not close connections on 'end'
function(err) {
if (err) {
console.error(err.message);
}
});
});
});
您可能会将结果流式传输到文件或 HTTP 响应对象。在任何一种情况下,您都可能需要适当的 JSON 而不是驱动程序 returns 的个别行。查看此问题以了解如何执行此操作的示例: https://github.com/oracle/node-oracledb/issues/908#issuecomment-390006986