【问题标题】:SQL Server queries with mssql crashing node app使用 mssql 崩溃节点应用程序的 SQL Server 查询
【发布时间】:2015-02-20 02:55:19
【问题描述】:

我一直在开发一个 node.js 应用程序,该应用程序使用 mssql 模块连接到 SQL Server 数据库,但我遇到了麻烦。

基本上,mssql 似乎存在某种错误,如果任何类型的查询结果返回一定数量的记录,它只会使应用程序崩溃。没有什么太重的。我说的是 50 到 100 条记录!

这也不是特定于查询的。无论结果如何,我的所有查询都会发生这种情况。

如果我将查询限制为返回 10、20、40 条记录(使用“SELECT TOP x ...”),查询运行良好,但一旦我将限制增加到更多记录,应用程序就会崩溃没有一条错误消息。没有例外。什么都没有。

开始发生这种情况的实际记录数因查询而异。看起来 mssql 有一个错误或设计限制,会影响它可以返回的数据量。

我错过了什么吗?是否有我应该更改的设置以避免这种情况?或者,我可以使用其他任何 npm 连接到 SQL Server 吗?

不用说,这对我来说是一个表演障碍。我应该完全放弃 node.js 吗?

关键是,如果我找不到连接到 SQL Server 的正确方法,那么我将无法在此应用程序中使用 node.js,而必须切换到其他东西。

谢谢!

更新 1

以下是导致此问题的部分代码:

// Basic modules
var express = require("express");
var bodyParser = require("body-parser");

// Custom modules
var settings = require("./lib/settings.js").GetSettings();

var app = express();

app.use(bodyParser.json());
app.use('/', express.static(__dirname + "/public"));

/***************************************************************************************************************/
// Routes

app.get("/GetBrands", function(req, res) {
    var sql = require('mssql');

    var config = {
        user: settings.DatabaseConfiguration.user,
        password: settings.DatabaseConfiguration.password,
        server: settings.DatabaseConfiguration.server,
        database: settings.DatabaseConfiguration.database
    };

    var cmd = "SELECT TOP 5 * FROM Brands WHERE Status = 'a'";

    var connection = new sql.Connection(config, function(err) {
        // ... error checks
        if (err) {
            console.log(err);
        }

        // Query

        var request = new sql.Request(connection); // or: var request = connection.request();
        request.verbose = true;

        request.query(cmd, function(err, recordset) {
            // ... error checks
            if (err) {
                console.log(err);
            }

            console.log(recordset);

            connection.close();
        });
    });
});


/***************************************************************************************************************/

// Enable the port listening.
app.listen(process.env.PORT || 8050);

如果我将“SELECT TOP 5 * ...”的 SQL 语句更改为更大的数字,例如 60、80 或 100,应用程序就会崩溃。此外,响应只是每个品牌的名称和一个 ID。没有什么太复杂或太重的东西。

更新 2:

这些是我所遵循的步骤,这些步骤总是使应用程序崩溃:

  1. 通过输入命令行运行应用程序:node app.js
  2. 在网络浏览器中,转到http://localhost:8050/GetBrands。第一次,我得到的结果很好。没有崩溃。
  3. 再次运行它。应用程序崩溃。每次。

我还发现了其他东西。我正在使用 WebStorm 来编辑代码。如果我从那里启动调试器,我不会崩溃,也不会出现任何问题。该应用程序可以正常工作。只有当我直接从命令行运行它时,它才会崩溃,或者在没有调试器监听的情况下从 WebStorm 运行它......这有多疯狂??

我尝试应用 WebStorm 调试器使用的相同命令行参数,但没有任何区别。

我希望有人能尽快阐明,因为我已经非常接近完全放弃这个项目的 node.js 了。

我可以切换到使用不同的 SQL Server npm 包,但那是哪一个呢?我已经尝试过mssql、node-sqlserver-unofficial 和乏味的,他们都有同样的问题,所以我猜这是TDS的问题。

【问题讨论】:

  • 我有点怀疑这是节点的问题,如果有的话,它是连接器或它连接到的服务器的问题。你能告诉simple node.js app你正在测试这个问题吗?
  • 应用程序如何崩溃?有错误信息吗?
  • 不幸的是,没有。根本没有错误消息。它只是停止节点应用程序而没有任何消息。

标签: sql-server node.js


【解决方案1】:

通过使用流式接口,您可以显着减少开销,并允许更好地处理非常大的查询结果。我使用流接口,例如通过管道导出文件(csv 和 xml)。

通过一个相对简单的测试,我可以让节点本身加载一个 very 包含 36 个字符的字符串(使用 uuid.v4() 生成)的大数组,这对我来说大约 1GB利用。我的猜测是在运行实例中允许的引用数量存在硬性限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2022-01-15
    • 1970-01-01
    • 2016-12-06
    • 2017-08-04
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多