1

我正在开发一个应用程序。它必须以平均水平插入记录。约 900 条记录/秒的速率。
为此,我正在尝试构建一个基于 TCP 的控制台应用程序,它侦听使用 Node.JS 作为我的平台连接到服务器的客户端。

我正在触发一个存储过程以将静态文本(在表中)作为参数插入到 SP,但它不工作并且没有捕获任何错误。

谁能帮我解决这个问题?我是 node.js 的新手

我的服务器端应用程序:

var net     = require('net');
var fs      = require('fs');
var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

var HOST = '127.0.0.1';
var PORT = 7000;
var timeout = 420000; // msec - *420000 

//db conn config
var config = {
  server: '192.168.0.57',
  userName: 'sa',
  password: 'sa',
  options: {
    database: "NodeJSBenchmark",
  }
 };
var lg = function(message) {
    console.log(message);
};

var server = net.createServer();
var connection = new Connection(config);

server.on('listening', function() {
    lg('Server listening on ' + HOST +':'+ PORT);
});

server.on('connection', function(sock) {
    sock.setTimeout(timeout, function() {
        try {
            sock.end();
        }
        catch(x) {
            lg('on end' + x);
        }
    });

    function executeStatement() {
    //var storedProcName = '[NodeJSBenchmark].[dbo].[spINSERTsockdata]';
    var storedProcName = 'spINSERTsockdata';
    var request = new Request(storedProcName, function(err, rowCount) {
    if(err){
      lg('Error on insert' + err);
    }
    else {
      lg(rowCount + ' rows2');
      lg('SP fininshed running..');
  }
    connection.close();
  });

  request.addParameter('sockdata', TYPES.VarChar, 'ping'); 

  request.on('doneProc', function(rowCount, more, returnStatus) {
    lg('Rows Changed: ' + rowCount + 'Return Stat: ' + returnStatus);  
  });

  connection.callProcedure(request);
  }

    sock.setNoDelay(true);

    //sock.setEncoding('ascii');

    // Identify incoming client
    sock.name = sock.remoteAddress + ":" + sock.remotePort 

    sock.on('data', function(data) {
        try {
        //lg("CONNECTED: "+sock.name);
        //lg("INCOMING DATA: "+data);
        sock.write(data);

        connection.on('connect', function(err) {
        // If conn is active; hit db..
        executeStatement();
        });

        }
        catch(x) {
            lg(x);
        }
    });

    sock.on('end', function(data) {
        try {
            sock.end();
        }
        catch(x) {
            lg('on end' + x);
        }
    });

    sock.on('error', function(err) {
        lg(err);
    });

    sock.on('close', function(data) {

        try {
            sock.end();
        }
        catch(x) {
            lg(x);
        }

        try {
            sock.destroy();
        }
        catch(x) {
            lg('on close' + x);
        }
    });

    sock.on('timeout', function() {
    });

});

server.on('error', function(err) {
});

server.on('close', function() {
});

server.listen(PORT, HOST);

SP:

USE [NodeJSBenchmark]
GO
/****** Object:  StoredProcedure [dbo].[spINSERTsockdata]    Script Date: 9/5/2013 4:16:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[spINSERTsockdata] @sockdata varchar(10)

AS

SET NOCOUNT ON

INSERT INTO [dbo].[tblSockData]
           ([inbound])
     VALUES
           (@sockdata)
4

1 回答 1

2

请尝试添加以下代码:
var TYPES = require('tedious').TYPES;
由于给出的代码TYPES未定义


确保为 SQL 启用 TCP/IP 遵循以下步骤:

  • 运行 SQL Server 配置管理器。

  • 转到 SQL Server 网络配置 > SQLEXPRESS 的协议。

  • 确保 TCP/IP 已启用。

然后右键单击 TCP/IP 并选择属性,验证在 IP2 下,IP 地址设置为本地子网上的计算机 IP 地址,确保 TCP 动态端口为空并确保 TCP 端口设置为 1433 . (乏味的默认尝试在这个端口上)


以下是对我有用的代码(已测试)

var net     = require('net');
var fs      = require('fs');
var TYPES = require('tedious').TYPES;
var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

var HOST = '127.0.0.1';
var PORT = 7000;
var timeout = 420000; // msec - *420000 

//db conn config
var config = {
  server: '127.0.0.1',
  userName: 'sa',
  password: '12345',
  options: {
    database: "NodeJSBenchmark",
    instanceName : "SQLEXPRESS"
  }
 };
var lg = function(message) {
    console.log(message);
};

var server = net.createServer();
var connection = new Connection(config);

connection.on('connect', function (err) {
    if (err) { return console.log('Error connecting:\t' + err); }
    else {
        console.log('CONNECTED TO MS-SQL');
    }
});

connection.on('errorMessage', function (err) {
    if (err) { return console.log('Error connecting 2:\t' + JSON.stringify(err)); }
});

connection.on('infoMessage', function (info) {
    if (err) { return console.log('Information:\t' + JSON.stringify(info)); }
});

server.on('listening', function() {
    lg('Server listening on ' + HOST +':'+ PORT);
});

server.on('connection', function (sock) {
    sock.setTimeout(timeout, function () {
        try {
            sock.end();
        }
        catch (x) {
            lg('on end' + x);
        }
    });


    function executeStatement() {
        //var storedProcName = '[NodeJSBenchmark].[dbo].[spINSERTsockdata]';
        var storedProcName = 'spINSERTsockdata';
        var request = new Request(storedProcName, function (err, rowCount) {
            if (err) {
                lg('Error on insert' + err);
            }
            else {
                lg(rowCount + ' rows2');
                lg('SP fininshed running..');
            }
            connection.close();
        });

        request.addParameter('sockdata', TYPES.VarChar, 'ping');

        request.on('doneProc', function (rowCount, more, returnStatus) {
            lg('Rows Changed: ' + rowCount + 'Return Stat: ' + returnStatus);
        });

        connection.callProcedure(request);
    }

    sock.setNoDelay(true);

    //sock.setEncoding('ascii');

    // Identify incoming client
    sock.name = sock.remoteAddress + ":" + sock.remotePort

    sock.on('data', function (data) {
        try {
            //lg("CONNECTED: "+sock.name);
            //lg("INCOMING DATA: "+data);
            sock.write(data);
            executeStatement();
        }
        catch (x) {
            lg(x);
        }
    });

    sock.on('end', function (data) {
        try {
            sock.end();
        }
        catch (x) {
            lg('on end' + x);
        }
    });

    sock.on('error', function (err) {
        lg(err);
    });

    sock.on('close', function (data) {

        try {
            sock.end();
        }
        catch (x) {
            lg(x);
        }

        try {
            sock.destroy();
        }
        catch (x) {
            lg('on close' + x);
        }
    });

    sock.on('timeout', function () {
    });

});

server.on('error', function(err) {
});

server.on('close', function() {
});

server.listen(PORT, HOST);
于 2013-09-05T09:56:23.540 回答