Tedious: ノードjsWebアプリから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)
EmmitOneで(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)
EmmitOneで(events.js:96:13)
Socket.emitで(events.js:188:7)
コード: 'ESOCKET'、
originalError:_

バージョンの詳細:
「退屈」:「2.0.1」、
"mssql": "^ 4.0.4"、

ありがとう、
プラビーン。

最も参考になるコメント

マイクロソフトの公式サンプルからコピーしたコードを使用すると、同じエラーが発生しました: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最後に、「SQLServer構成マネージャー」->「SQLServerネットワーク構成」->「プロトコル」で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' }

全てのコメント19件

ねえ@ Praveen335👋🏻

tediousを使用しているときに、この問題が発生しているとのことで、ご不便をおかけしております。 残念ながら、あなたが提供した情報は、私たちが何が起こっているのかを理解するのに十分ではありません。 詳細を教えてください。 たとえば、次のことを知っておくと役に立ちます。

  • どのバージョンのtediousを正確に使用していますか?
  • このエラーはいつ正確に発生しますか? スタックトレースから、データベースに接続するときにこれが発生するように見えますが、他のプロセスが同時に接続することはできますか? これはSQLServerの問題(おそらくあなたが言及した高負荷が原因)であり、 tedious自体の問題ではないと思います。

ありがとう! 🙇🏻‍♂️

こんにちは@arthurschreiber
早速の対応、ありがとうございました。 私はすでに私の投稿で退屈なバージョンを更新しました。

バージョンの詳細:
「退屈」:「2.0.1」、
"mssql": "^ 4.0.4"、

SQLサーバーへのアクティブな作業スレッドと、Microsoftサポートに引き上げることによるネットワーク接続を確認しました。 彼らはSQLServerの終わりからすべて良いと述べました。 作業スレッドの割合も少なくなります。 カスタムロジックで再試行しました。 しかし、運はありません。 ソケットエラーが発生した後、後続のすべての要求に対して継続的にスローされます。 どんな提案や推薦も本当に私たちを助けます。 現在、データベースへの接続に接続プールを使用しています。

ありがとう、
プラビーン。

ここでも同じですが、突然その状態になって行き詰まってしまいます...

システムでも同じ接続エラーが発生しています。

サービス開始時にconnectionPoolを接続しています。
new App.SQL.ConnectionPool

ランダムな瞬間に、リクエストは次のように失敗します。

ConnectionError:データベースサーバーに接続できませんでした:1433-接続できませんでした(シーケンス)

サービスは自動的に再起動しますが、これらのエラーを約20分間スローし続けます。 その後、サービスが再起動し、再び接続できるようになります。

このサーバー上の複数のノードプロセスでこれが見られますが、同時にダウンすることはありません(場合によってはダウンします)。これはちょっと奇妙です。 原因は、mssqlDBではなくNodeJSアプリにあると考えられます。

これらのバージョンを使用しています。

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)

MSSQLServerのバージョンを記述します。 現在、SQLNCLI11はMSSQL2017インスタンスの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

最後に、「SQLServer構成マネージャー」->「SQLServerネットワーク構成」->「プロトコル」で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' }

マイクロソフトの公式サンプルからコピーしたコードを使用すると、同じエラーが発生しました: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最後に、「SQLServer構成マネージャー」->「SQLServerネットワーク構成」->「「->」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への接続に失敗しました。internal 1433-接続できませんでした(シーケンス)」。

これはコードです:

`
const config = {
ユーザー:Config.sql.sqluser、
パスワード:Config.sql.sqlpassword、
サーバー:Config.sql.sqlhost、
データベース:Config.sql.sqldatabase、
ポート:Config.sql.sqlport、
connectionTimeout:3000、
requestTimeout: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は、接続プールまたは退屈な接続プールを処理するために退屈なものを使用していますか? 面倒なプロジェクトを使用している場合は、面倒な接続プールを試して、それが役立つかどうかを確認できます。

こんにちはIanChokS、

退屈な接続プールパッケージを使用していませんが、mssqlパッケージのデフォルトのconnectionPoolを使用しています(退屈だと思います)。

ただし、mssqlパッケージをバージョン5.1に更新しました。安定しているようで、テストサービスで接続エラーは発生していません。 変更点の1つは次のとおりです。

プールライブラリをnode-poolからtarn.jsに移動しました

だから多分それは私たちの問題を解決しました。

また、最小プール接続を0に設定しましたが、それが影響を与える可能性があるかどうかはわかりません。

@MarioPerezEstesoサーバーへの接続に問題がある場合は、 TCP IPが有効になっていること、およびサーバーに到達可能かどうかを確認するための構成に正しいポート番号があることを確認してください。

@ regevbr@ Praveen335接続プールを使用している場合は、TimTilroyが接続の問題を修正するかどうかを確認するために行ったように、ノードプールの代わりにtarn.jsライブラリを試して使用できます。 そうでない場合は、おそらく最新の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メソッドを呼び出して、このメッセージを無音にしてください。 internal \ process \ 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( 'tedious')。Connection;
var config = {
サーバー: 'localhost'、
認証:{
タイプ: 'デフォルト'、
オプション:{
userName: 'sa'、
パスワード: '####'、
ポート:1433
}
}、
オプション:{
データベース: '会社'、
instanceName: 'MSSQLSERVER'、
rowCollectionOnDone:true、
useColumnNames:false、
trustServerCertificate:false
}
};
var connection = new Connection(config);
connection.on( 'connect'、function(err){
if(err){
console.log( '接続に失敗しました');
エラーをスローします。
}
それ以外{
console.log( '接続済み');
}
});
module.exports =接続;

マイクロソフトの公式サンプルからコピーしたコードを使用すると、同じエラーが発生しました: https ://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/step/2.html

最後に、「SQLServer構成マネージャー」->「SQLServerネットワーク構成」->「「->」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接続エラーを実験していますが、アプリはAWSEC2からASRDSに接続されており、ほとんどの時間動作しているため、この問題はTCP / IPとは関係ありません。

最後に、エラーを解決しました。 新しい接続をリクエストするたびに使用していたスクリプト:

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 評価