Tedious: Erro de conexão ESOCKET do aplicativo da web do nó js para a conexão do banco de dados MSSql

Criado em 25 set. 2018  ·  19Comentários  ·  Fonte: tediousjs/tedious

Oi equipe,
Atualmente, estamos recebendo os problemas de conectividade intermitentes do nosso aplicativo Web para o MsSql com frequência quando há mais tráfego para o serviço.
Existe alguma recomendação final sobre esta questão.

Erro :
_{ ConnectionError: Falha ao conectar a <>:1433 - Não foi possível conectar (sequência)
em Connection.tedious.once.err (D:\home\site\wwwroot\node_modules\mssql\lib\tedious.js:216:17)
em Connection.g (eventos.js:291:16)
em emitOne (eventos.js:96:13)
em Connection.emit (eventos.js:188:7)
em Connection.socketError (D:\home\site\wwwroot\node_modules\tedious\lib\connection.js:699:14)
em D:\home\site\wwwroot\node_modules\tedious\lib\connection.js:590:25
em SequentialConnectionStrategy.connect (D:\home\site\wwwroot\node_modules\tedious\lib\connector.js:153:9)
em Socket.onError (D:\home\site\wwwroot\node_modules\tedious\lib\connector.js:169:16)
em emitOne (eventos.js:96:13)
em Socket.emit (eventos.js:188:7)
código: 'ESOCKET',
Erro original:_

Detalhes da versão:
"tedioso": "2.0.1",
"mssql": "^4.0.4",

Obrigado,
Praveen.

Comentários muito úteis

obteve o mesmo erro ao usar o código copiado do exemplo oficial da microsoft: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

Finalmente, resolvi esse erro ativando o protocolo TCP/IP em "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' }

Todos 19 comentários

Oi @Praveen335 👋🏻

Lamentamos saber que você está enfrentando esse problema ao usar tedious . Infelizmente, as informações que você forneceu não são suficientes para que possamos entender o que está acontecendo. Você poderia fornecer mais informações? Por exemplo, seria útil para nós sabermos:

  • qual versão de tedious você está usando exatamente?
  • quando esse erro acontece exatamente? A partir do stacktrace, parece que isso acontece ao se conectar ao banco de dados, mas outros processos ainda podem se conectar ao mesmo tempo? Estou pensando que isso pode ser um problema do SQLServer (talvez devido à alta carga que você mencionou) e não um problema com o próprio tedious .

Obrigado! 🙇🏻‍♂️

Olá @arthurschreiber ,
Obrigado pela sua resposta rápida. Eu já atualizei a versão tediosa no meu post.

Detalhes da versão:
"tedioso": "2.0.1",
"mssql": "^4.0.4",

Demos uma olhada no encadeamento de trabalho ativo para o servidor SQL e a conectividade de rede, elevando-o para o suporte da Microsoft. Eles mencionaram tudo de bom do SQLServer. A porcentagem de thread de trabalho também é menor. Eu tentei tentar novamente com lógica personalizada. Mas sem sorte. Depois de obter o erro de soquete, ele está continuamente lançando para todas as solicitações subsequentes. Qualquer sugestão ou recomendação nos ajudaria muito. Atualmente, estamos usando o pool de conexões para conectar ao Banco de Dados.

Obrigado,
Praveen.

Mesmo aqui, de repente chega a esse estado e fica preso ...

Também estamos vendo os mesmos erros de conexão acontecendo em nosso sistema.

Estamos conectando um connectionPool no início do serviço.
new App.SQL.ConnectionPool

Em um momento aleatório, uma solicitação falha com:

ConnectionError: Falha ao conectar ao datab aseserver:1433 - Não foi possível conectar (sequência)

O serviço é reiniciado automaticamente, mas continua gerando esses erros por cerca de 20 minutos. Depois que o serviço é reiniciado e ele pode se conectar novamente.

Estamos vendo isso com vários processos de nó neste servidor, mas eles não estão caindo simultaneamente (às vezes, sim), o que é meio estranho. Acreditamos que a causa esteja no aplicativo NodeJS e não no banco de dados mssql.

Estamos usando estas versões:

mssql: 4.3.0 (mais recente)
versão tediosa incluída neste pacote é 2.7.1.

Oi. Também estamos passando por esse problema.

Estas são as nossas versões:
mssql: 4.3.0
que usa a versão tediosa: 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)

Escreva suas versões do MSSQL Server. Agora, SQLNCLI11 foi substituído por MSOLEDBSQL para instância MSSQL2017.
https://blogs.msdn.microsoft.com/sqlnativeclient/2018/03/30/released-microsoft-ole-db-driver-for-sql-server/

obteve o mesmo erro ao usar o código copiado do exemplo oficial da microsoft: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

Finalmente, resolvi esse erro ativando o protocolo TCP/IP em "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' }

obteve o mesmo erro ao usar o código copiado do exemplo oficial da microsoft: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

Finalmente, resolvi esse erro ativando o protocolo TCP/IP em "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' }

Obrigada! Eu estava tendo exatamente esse problema ;)

Como ainda estamos enfrentando esse problema com quase todos os nossos serviços nodejs, fizemos alguns testes extras.
O comentário acima com a correção TCP/IP já estava habilitado em nosso sql server.

Criamos um novo serviço nodejs que não está fazendo absolutamente nada. Não é chamado por outro serviço, apenas roda em PM2.
Ele abrirá um novo pool de conexões quando for iniciado e ficará lá.

Recebemos 3 erros em 5 dias, acontecendo aleatoriamente:
"ConnectionError: Falha ao conectar ao sql.tilroy. internal:1433 - Não foi possível conectar (sequência)".

Este é o código:

`
configuração const = {
usuário: Config.sql.sqluser,
senha: Config.sql.sqlpassword,
servidor: Config.sql.sqlhost,
banco de dados: Config.sql.sqldatabase,
porta: Config.sql.sqlport,
tempo limite de conexão: 3000,
requestTimeout: 3000,
piscina: {
máximo: 100,
min: 1, //não feche todas as conexões.
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);
});

`

Atualizamos nosso servidor SQL, mas isso não ajudou. Atualizamos todos os nossos pacotes, mas ainda recebemos esses erros.
Algo mais que possamos tentar? Preferimos não descartar o tedious/mssql, pois o usamos em muitos serviços.

@TimTilroy você está usando tedious para lidar com seu pool de conexões ou o tedious-connection-pool ? Se você estiver usando o projeto tedioso, talvez possa tentar o tedious-connection-pool e ver se isso ajuda.

Olá IanChoks,

Não estamos usando o pacote tedious-connection-pool, mas o connectionPool padrão do pacote mssql (acredito que está usando tedious).

No entanto, atualizamos o pacote mssql para a versão 5.1 agora e parece estável, não temos mais erros de conexão em nosso serviço de teste. Uma das mudanças é a seguinte:

Biblioteca de pool movida do pool de nós para tarn.js

Então talvez isso tenha resolvido nosso problema.

Também definimos as conexões do pool mínimo para 0, não sei se isso pode ter algum efeito.

@MarioPerezEsteso se você está tendo problemas para se conectar ao seu servidor, você pode tentar certificar-se de que o TCP IP está habilitado e que você tem o número da porta correto em sua configuração para verificar se o servidor está acessível.

@regevbr , @Praveen335 Se você estiver usando pool de conexão, você pode tentar usar a biblioteca tarn.js em vez do pool de nós como o que TimTilroy fez para ver se ele corrige seus problemas de conexão. Se não, talvez tente atualizar para o mssql mais recente (v5.1).

Atualização: aplicamos a nova versão do mssql (5.1.0) a todos os nossos serviços sql, atualizamos as conexões do pool mínimo para 0 e parece que os erros de conexão pararam desde o nosso deploy.

Eu acho que o problema é só porque você está usando "/" em vez de "\" no nome ou algo assim

@Praveen335 Você tentou atualizar para a nova versão do mssql (5.1.0) para ver se resolve seu problema? Caso contrário, sinta-se à vontade para reabrir este problema.

Estou usando as versões:
mssql: "^6.2.0",
tedioso: "^8.3.0"

Eu habilitei o TCP/IP no gerenciador de configuração. Além disso, todos os meus serviços sql estão em execução. ainda estou recebendo o seguinte erro:

C:\Nodejs\node-sql-conn\Database>node connect.js
tedious obsoleto Na próxima versão principal do tedious , a criação de uma nova instância Connection não estabelecerá mais uma conexão com o servidor automaticamente. Por favor, use a nova função auxiliar connect ou chame o método .connect Connection recém-criado para silenciar esta mensagem. internal\process\task_queues.js:79:11
Falha na conexão

C:\Nodejs\node-sql-conn\Databaseconnect.js:26
jogar errar;
^
ConnectionError: Falha ao conectar-se ao localhost:undefined - Não é possível chamar a gravação após a destruição de um fluxo
em ConnectionError (C:\Nodejs\node-sql-conn\node_modulestedious\lib\errors.js:13:12)
em Connection.socketError (C:\Nodejs\node-sql-conn\node_modulestedious\libconnection.js:1308:56)
em Soquete.(C:\Nodejs\node-sql-conn\node_modulestedious\libconnection.js:1143:14)
em Socket.emit (eventos.js:327:22)
em errorOrDestroy (interno/streams/destroy.js:108:12)
em onwriteError (_stream_writable.js:418:5)
em onwrite (_stream_writable.js:445:5)
em doWrite (_stream_writable.js:399:11)
em writeOrBuffer (_stream_writable.js:387:5)
em Socket.Writable.write (_stream_writable.js:318:11) {
código: 'ESOCKET'
}

Este é o meu Código:
var Conexão = require('tedious').Connection;
var configuração = {
servidor: 'localhost',
autenticação: {
tipo: 'padrão',
opções: {
nome de usuário: 'sa',
senha: '####',
porta: 1433
}
},
opções: {
banco de dados: 'Empresa',
instanceName: 'MSSQLSERVER',
rowCollectionOnDone: true,
useColumnNames: false,
trustServerCertificate: false
}
};
var conexão = new Connection(config);
connection.on('connect',function(err){
if(erro){
console.log('Falha na conexão');
jogar errar;
}
senão{
console.log('Conectado');
}
});
modulo.exports = conexao;

obteve o mesmo erro ao usar o código copiado do exemplo oficial da microsoft: https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

Finalmente, resolvi esse erro ativando o protocolo TCP/IP em "Sql Server Configuration Manager"->"SQL Server Network Configuration"->" Protocols for "->"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' }

Este trabalho para mim. Obrigado por me dar a solução.

Também estou experimentando esses erros de conexão ESOCKET, e o problema não está relacionado ao TCP/IP, pois o aplicativo está conectado do AWS EC2 ao AS RDS e está funcionando na maioria das vezes.

FINALMENTE resolvi o erro. O script que eu estava usando cada vez que solicitava uma nova conexão:

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);
        });
    })
}

O script que resolveu o problema:

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);
        });
    });
}

onde pool2Connect precisa ser definido inicialmente, ao iniciar o script:

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

Espero que ajude

Esta página foi útil?
0 / 5 - 0 avaliações