Node ms sql阻塞代码

时间:2016-06-27 21:36:04

标签: sql-server node.js node-mssql

我正在尝试使用node-mssql从我的节点应用程序在远程MS sql服务器上执行存储过程。

问题:调用似乎是阻塞而不是异步,因为除非第一个请求完成,否则来自其他客户端的任何其他请求都不会得到响应。

 sql.connect(config).then(function() {
        new sql.Request()
        .input('mysp', sql.TVP, tvp)
        .execute('spParam1').then(function(recordsets) {
              callback(null, recordsets[0]);
        }).catch(function(err) {
            callback(err, []);
        });
    }).catch(function(err) {
         callback(err, []);
    });

提到的'回调'是api预期的函数回调。

我尝试了一个简单的

示例
   setTimeout(function() {
                 callback("error.message", []);
   }, 60000);

在这种情况下,两个客户端都工作,Node返回第二个请求的线程。

我尝试过使用promises,callbacks和streaming的例子。所有这些都会阻止I / O.

我在这里俯瞰什么?

编辑:只是使用了一个查询而不是'执行',它按预期工作,没有阻止i / o

dbConn.connect().then(function () {
        logger.info("sql connection established")
        var request = new sql.Request(dbConn);
        // request.input('mysp', sql.TVP, tvp)
        //     .execute("spParam1").then(function (recordSet) {
            request.query("WAITFOR DELAY '00:00:22'").then(function(){
                dbConn.close();
                callback("no data", []);
            }).catch(function (err) {
                callback(err, []);
                logger.error(err)
                dbConn.close();
            });
    }).catch(function (err) {
        logger.error(err)
        callback(err, []);
    });

2 个答案:

答案 0 :(得分:0)

这是我在没有任何阻止的情况下执行的测试

SQL Procs

等待1分钟

CREATE PROCEDURE [dbo].[usp_node_test_wait]
AS
BEGIN
    SET NOCOUNT ON;

    WAITFOR DELAY '00:01:00';
    SELECT GETDATE() [date]
END

没有等待

CREATE PROCEDURE [dbo].[usp_node_test]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT GETDATE() [date]
END

节点代码 连接到db打开Web服务器

var sql = require('mssql');
var http = require('http');

var PORT = 8080 || process.env.PORT;


var config = {
    user: 'node',
    password: 'node',
    server: 'localhost',
    database: 'nodedb',
    options: {
        instanceName: 'sqlexpress'
    },
    pool: {
        max: 10,
        min: 0,
        idleTimeoutMillis: 30000
    },
    requestTimeout: 70000
}


var connection = new sql.Connection(config);


connection.connect(function(err){
    if(err){
        console.log('Error connecting to the DB ', err);
    } else {
        console.log('Database Connection Established');
        var server = http.createServer(handleRequest);
        server.listen(PORT, function(){
            console.log('Web server listening on http://localhost:%s', PORT);
        });

    }
});

function handleRequest(request, response){

    var req = request;
    console.log('Url Requested: ', req.url)
    if(req.url == '/nowait'){
        var request = new sql.Request(connection);
        request.execute('usp_node_test', function(err, recordsets, returnValue, affected){
            if (err) {
                console.log('Error: ', err)
            } else {
                var data = recordsets[0][0];
                console.log(data.date);
                response.end('Date returned by the server: ' + data.date);
            }

        });
    } else {
        var request = new sql.Request(connection);
        request.execute('usp_node_test_wait', function(err, recordsets, returnValue, affected){
            if (err) {
                console.log('Error: ', err)
            } else {
                var data = recordsets[0][0];
                console.log(data);
                response.end('Date returned by the server: ' + data.date);
            }
        });
    }

}

使用http://localhost/nowait尽快在请求中使用sql进程 使用http://localhost/anything else等待1分钟

您会看到一个请求不会干扰另一个请求,因此没有阻止

答案 1 :(得分:0)

刚收到Tedious队员的确认 https://github.com/tediousjs/tedious/issues/475#issuecomment-260009906

看起来像是一个阻塞电话。