Tedious: 从节点 js Web 应用程序到 MSSql 数据库连接的 ESOCKET 连接错误

创建于 2018-09-25  ·  19评论  ·  资料来源: tediousjs/tedious

大家好,
目前,当服务流量增加时,我们经常会遇到从 Web 应用程序到 MsSql 的间歇性连接问题。
有没有关于这个问题的最终建议。

错误
_{ ConnectionError: 无法连接到 <>:1433 - 无法连接(序列)
在 Connection.tedious.once.err (D:\home\site\wwwroot\node_modules\mssql\lib\tedious.js:216:17)
在 Connection.g (events.js:291:16)
在 emitOne (events.js:96:13)
在 Connection.emit (events.js:188:7)
在 Connection.socketError (D:\home\site\wwwroot\node_modules\tedious\lib\connection.js:699:14)
在 D:\home\site\wwwroot\node_modules\tedious\lib\connection.js:590:25
在 SequentialConnectionStrategy.connect (D:\home\site\wwwroot\node_modules\tedious\lib\connector.js:153:9)
在 Socket.onError (D:\home\site\wwwroot\node_modules\tedious\lib\connector.js:169:16)
在 emitOne (events.js:96:13)
在 Socket.emit (events.js:188:7)
代码:'ESOCKET',
原始错误:_

版本详情:
“乏味”:“2.0.1”,
"mssql": "^4.0.4",

谢谢,
普拉文。

最有用的评论

使用从微软官方示例复制的代码时出现同样的错误: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最后,我通过在“Sql Server Configuration Manager”->“SQL Server Network Configuration”->“Protocols for"->"TCP/IP"

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189:13) at emitErrorNT (internal/streams/destroy.js:82:8) at emitErrorAndCloseNT (internal/streams/destroy.js:50:3) at process._tickCallback (internal/process/next_tick.js:63:19) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

所有19条评论

@ Praveen335👋🏻

得知您在使用tedious时遇到此问题,我深感遗憾。 不幸的是,您提供的信息不足以让我们了解正在发生的事情。 你能提供更多信息吗? 例如,这对我们会有所帮助:

  • 您使用的是哪个版本的tedious
  • 这个错误什么时候发生? 从堆栈跟踪来看,连接到数据库时会发生这种情况,但其他进程仍然可以同时连接吗? 我认为这可能是 SQLServer 问题(可能是由于您提到的高负载),而不是tedious本身的问题。

谢谢! 🙇🏻‍♂️

@arthurschreiber
谢谢你快速的回复。 我已经在我的帖子中更新了繁琐的版本。

版本详情:
“乏味”:“2.0.1”,
"mssql": "^4.0.4",

我们通过将其提升到 Microsoft 支持来查看 SQL 服务器和网络连接的活动工作线程。 他们从 SQLServer 端提到了一切都很好。 工作线程百分比也较少。 我试图用自定义逻辑重试。 但没有运气。 收到套接字错误后,它会不断抛出所有后续请求。 任何建议或建议都会对我们有所帮助。 目前,我们正在使用连接池连接到数据库。

谢谢,
普拉文。

同样在这里,它突然进入那个状态并卡住了......

我们还看到我们的系统上发生了相同的连接错误。

我们在服务启动时连接一个连接池。
new App.SQL.ConnectionPool

在随机时刻,请求失败并显示:

ConnectionError:无法连接到数据库服务器:1433 - 无法连接(序列)

服务会自动重新启动,但会持续抛出这些错误大约 20 分钟。 该服务重新启动后,它可以再次连接。

我们在这台服务器上看到了多个节点进程,但它们并没有同时关闭(有时它们会关闭),这有点奇怪。 我们认为原因在于 NodeJS 应用程序而不是 mssql 数据库。

我们正在使用这些版本:

mssql:4.3.0(最新)
这个包中包含的繁琐版本是 2.7.1。

你好。 我们也遇到了这个问题。

这些是我们的版本:
mssql:4.3.0
使用繁琐的版本:2.7.1

ConnectionError: Failed to connect to xxxxxx.database.windows.net:1433 in 15000ms
at Connection.tedious.once.err (...node_modules\mssql\lib\tedious.js:239:17)
at Object.onceWrapper (events.js:315:30)
at emitOne (events.js:116:13)
at Connection.emit (events.js:211:7)
at Connection.connectTimeout (...node_modules\mssql\node_modules\tedious\lib\connection.js:944:12)
at Timeout._onTimeout (...node_modules\mssql\node_modules\tedious\lib\connection.js:913:16)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)

编写您的 MSSQL Server 版本。 现在,对于 MSSQL2017 实例,SQLNCLI11 已替换为 MSOLEDBSQL。
https://blogs.msdn.microsoft.com/sqlnativeclient/2018/03/30/released-microsoft-ole-db-driver-for-sql-server/

使用从微软官方示例复制的代码时出现同样的错误: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最后,我通过在“Sql Server Configuration Manager”->“SQL Server Network Configuration”->“Protocols for"->"TCP/IP"

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189:13) at emitErrorNT (internal/streams/destroy.js:82:8) at emitErrorAndCloseNT (internal/streams/destroy.js:50:3) at process._tickCallback (internal/process/next_tick.js:63:19) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

使用从微软官方示例复制的代码时出现同样的错误: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最后,我通过在“Sql Server 配置管理器”->“SQL Server 网络配置”->“Protocols for”->“TCP/IP”中启用 TCP/IP 协议解决了这个错误

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189:13) at emitErrorNT (internal/streams/destroy.js:82:8) at emitErrorAndCloseNT (internal/streams/destroy.js:50:3) at process._tickCallback (internal/process/next_tick.js:63:19) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

谢谢! 我遇到了这个确切的问题;)

由于我们几乎所有的 nodejs 服务仍然遇到这个问题,我们做了一些额外的测试。
上面带有 TCP/IP 修复的评论已经在我们的 sql 服务器上启用。

我们创建了一个完全什么都不做的新 nodejs 服务。 它不被其他服务调用,只是在 PM2 中运行。
它将在启动时打开一个新的连接池,然后就坐在那里。

我们在 5 天内遇到了 3 个错误,随机发生:
“ConnectionError:无法连接到 sql.tilroy。内部:1433 - 无法连接(序列)”。

这是代码:

`
常量配置 = {
用户:Config.sql.sqluser,
密码:Config.sql.sql密码,
服务器:Config.sql.sqlhost,
数据库:Config.sql.sql数据库,
端口:Config.sql.sqlport,
连接超时:3000,
请求超时:3000,
水池: {
最大:100,
min: 1, //不要关闭所有连接。
idleTimeoutMillis: 1000,
evictionRunIntervalMillis: 1500000
}
};

const sqlConnection = new SQL.ConnectionPool(config, function (err) {
    Log.debug("got sql connection");
    if(err){
        Log.error(err);
        process.exit(1);
    }
});

sqlConnection.on('error', err => {
    Log.error(`Connection err : ${err}`);
    process.exit(1);
});

`

我们升级了我们的 SQL 服务器,但这并没有帮助。 更新了我们所有的软件包,但仍然出现这些错误。
还有什么我们可以尝试的吗? 我们宁愿不要扔掉繁琐的/mssql,因为我们在很多服务中都使用它。

@TimTilroy您是使用 tedious 来处理连接池还是 tedious -connection-pool ? 如果您使用的是繁琐的项目,也许您可​​以尝试使用繁琐的连接池,看看是否有帮助。

嗨,IanChokS,

我们没有使用 tedious-connection-pool 包,而是 mssql 包的默认连接池(我相信它的使用很乏味)。

但是我们现在已经将 mssql 包更新到了​​ 5.1 版,并且看起来很稳定,我们的测试服务上没有更多的连接错误。 其中一项更改如下:

将池库从节点池移动到 tarn.js

所以也许这解决了我们的问题。

我们还将最小池连接数设置为 0,不知道这是否会产生任何影响。

@MarioPerezEsteso如果您在连接服务器时遇到问题,您可以尝试确保TCP IP 已启用并且您的配置中有正确的端口号,以检查服务器是否可访问。

@regevbr , @Praveen335如果您使用连接池,您可以尝试使用 tarn.js 库,而不是像 TimTilroy 所做的那样使用节点池来查看它是否可以解决您的连接问题。 如果没有,也许尝试升级到最新的 mssql (v5.1)。

更新:我们已将新版本的 mssql (5.1.0) 应用于我们所有的 sql 服务,将最小池连接更新为 0,看起来连接错误自我们部署以来已停止。

我认为问题只是因为您在名称中使用“/”而不是“\”或类似的东西

@Praveen335您是否尝试升级到新版本的 mssql (5.1.0) 以查看它是否解决了您的问题? 如果没有,请随时重新打开此问题。

我正在使用版本:
mssql: "^6.2.0",
乏味:“^8.3.0”

我在配置管理器中启用了 TCP/IP。 我所有的 sql 服务也在运行。 但我收到以下错误:

C:\Nodejs\node-sql-conn\Database>node connect.js
不推荐使用繁琐 在tedious的下一个主要版本中,创建新的Connection实例将不再自动建立与服务器的连接。 请使用新的connect辅助函数或在新创建的Connection对象上调用.connect方法以使此消息静音。 内部\进程\task_queues.js:79:11
连接失败

C:\Nodejs\node-sql-conn\Databaseconnect.js:26
抛出错误;
^
ConnectionError: 无法连接到localhost:undefined - 流被销毁后无法调用 write
在 ConnectionError (C:\Nodejs\node-sql-conn\node_modulestedious\lib\errors.js:13:12)
在 Connection.socketError (C:\Nodejs\node-sql-conn\node_modulestedious\libconnection.js:1308:56)
在套接字。(C:\Nodejs\node-sql-conn\node_modulestedious\libconnection.js:1143:14)
在 Socket.emit (events.js:327:22)
在 errorOrDestroy (internal/streams/destroy.js:108:12)
在 onwriteError (_stream_writable.js:418:5)
在 onwrite (_stream_writable.js:445:5)
在 doWrite (_stream_writable.js:399:11)
在 writeOrBuffer (_stream_writable.js:387:5)
在 Socket.Writable.write (_stream_writable.js:318:11) {
代码:'ESOCKET'
}

这是我的代码:
var Connection = require('乏味').Connection;
变量配置 = {
服务器:'本地主机',
验证: {
类型:'默认',
选项: {
用户名:'sa',
密码: '####',
端口:1433
}
},
选项: {
数据库:'公司',
instanceName: 'MSSQLSERVER',
rowCollectionOnDone:真,
使用列名:假,
信任服务器证书:假
}
};
var connection = new Connection(config);
connection.on('connect',function(err){
如果(错误){
console.log('连接失败');
抛出错误;
}
别的{
console.log('已连接');
}
});
module.exports = 连接;

使用从微软官方示例复制的代码时出现同样的错误: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最后,我通过在“Sql Server 配置管理器”->“SQL Server 网络配置”->“Protocols for”->“TCP/IP”中启用 TCP/IP 协议解决了这个错误
SQLServerConfigurationManager

C:\Users\zpc\Desktop\SqlServerSample>node connect.js { ConnectionError: Failed to connect to localhost:1433 - Could not connect (sequence) at ConnectionError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\errors.js:13:12) at Connection.socketError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1183:28) at Connector.execute (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connection.js:1022:21) at SequentialConnectionStrategy.connect (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:69:7) at Socket.onError (C:\Users\zpc\Desktop\SqlServerSample\node_modules\tedious\lib\connector.js:84:12) at Socket.emit (events.js:189:13) at emitErrorNT (internal/streams/destroy.js:82:8) at emitErrorAndCloseNT (internal/streams/destroy.js:50:3) at process._tickCallback (internal/process/next_tick.js:63:19) message: 'Failed to connect to localhost:1433 - Could not connect (sequence)', code: 'ESOCKET' }

这对我有用。 谢谢你给我解决方案。

我也在试验这个 ESOCKET 连接错误,这个问题与 TCP/IP 无关,因为应用程序从 AWS EC2 连接到 AS RDS 并且它大部分时间都在工作。

最后我解决了错误。 每次我请求新连接时我使用的脚本:

function getConnection () {
    // console.log("config")
    // console.log(config)
    return new Promise(function (resolve, reject) {
        const pool = new sql.ConnectionPool(getConfig())
        // console.log("Getting connection...");
        pool.connect()
        .then((cn) => {
            // console.log("connection got");
            resolve(cn);
        })
        .catch((e) => {
            // console.log("connection not got");
            reject(e);
        });
    })
}

解决问题的脚本:

function runCommand(cmdText) {
    return new Promise((resolve, reject) => {
        pool2Connect
        .then((pool) => {
            // pool.request() // or: new sql.Request(pool2)
            // .input('input_parameter', sql.Int, 10)
            // .output('output_parameter', sql.VarChar(50))
            // .execute('procedure_name', (err, result) => {
            //     // ... error checks
            //     console.dir(result)
            // })
            pool.request() // or: new sql.Request(pool2)
            .query(cmdText)
            .then((rows) => {
                return resolve(rows.recordset);
            })
            .catch((e) => {
                return reject(e);
            });
        })
        .catch((err) => {
            return reject(err);
        });
    });
}

在启动脚本时,最初需要定义 pool2Connect :

    pool2 = new sql.ConnectionPool(config);
    pool2Connect = pool2.connect();
    pool2.on('error', err => {
        console.log(err);
    });

希望能帮助到你

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

yianni-ververis picture yianni-ververis  ·  5评论

ggazulla picture ggazulla  ·  4评论

anthonylau picture anthonylau  ·  8评论

tvrprasad picture tvrprasad  ·  6评论

aniltomar10 picture aniltomar10  ·  5评论