【问题标题】:Node + SQL Server : Get row data as streamNode + SQL Server:获取行数据作为流
【发布时间】:2015-12-27 02:35:00
【问题描述】:

我尝试使用Node.Js connectorMicrosoft driver 与SQL Server 通信。在连接器文档中,我找到了一个名为“stream”的好选项。它增加了异步获取行对象的能力。

我的数据有一些特定的 - 一些列有大的二进制数据 (> 100 Mb)。所以即使是一排也可能真的很大。我正在寻找将每行数据作为流获取的能力。在 .NET 驱动程序中是可能的(CommandBehavior.SequentialAccess 枚举)。在 Node.js 中可以吗?

更新 这是一个演示问题的代码:

自定义可写流模块:

var stream = require('stream');
var util = require('util');

function WritableObjects() {

    stream.Writable.call(
        this,
        {
            objectMode: true
        }
    );

}

util.inherits( WritableObjects, stream.Writable );

WritableObjects.prototype._write = function( chunk, encoding, doneWriting ) {
    console.log('write', chunk, encoding);
    doneWriting();
};


module.exports = {
    WritableObjects: WritableObjects
};

及数据库查询代码:

var sw = new wstream.WritableObjects();
var request = new sql.Request(connection);
request.stream = true;
request.pipe(sw);
request.query('SELECT DataId, Data FROM ds.tData WHERE DataId in (1)');

sw.on('error', function(err) {
    console.log('Stream err  ', err)
});

sw.on('pipe', function(src) {
    console.log('Stream pipe ')
});

sw.on('finish', function(data) {
    console.log('Stream finish')
});

我这个例子chunk_write方法的参数包含db记录的全部数据,而不是一个流。因为Data字段包含了很大的varbinary数据,所以node进程的内存也变大了。

【问题讨论】:

  • 没有期望 sql server 能够流式传输一行的字节——系统的核心并不这样做。数据按行返回。如果你真的需要它,你可以编写自己的模块,通过拆分行内容来做到这一点——但这会使你的应用程序变慢而不是变快。
  • .NET 数据提供者能够做到这一点。 ExecuteReader 方法返回 SqlDataReader 实例,该实例有 Read 方法读取下一条记录和 GetBytes 方法读取部分二进制数据。

标签: sql-server node.js stream


【解决方案1】:

是的,您可以使用node-mssql 包进行流式查询,如下所述:https://github.com/patriksimek/node-mssql

stream - 流式传输记录集/行,而不是将它们作为回调的参数一次全部返回(默认值:false)。您还可以单独为每个请求启用流式传输 (request.stream = true)。如果您计划处理大量行,请始终设置为 true。

【讨论】:

  • 是的,我在上面提到了这个选项。但据我了解,它不提供获取行流的能力。我尝试了文档中的示例,并将行对象传递给“行”事件回调。不流式传输。
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 2021-12-22
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多