2017-07-07 4 views
0

私は私の問題でできるだけ明確にしようとします。接続が切断された場合、MSSQLは接続を選択します

私はこの特定のバージョン:https://github.com/patriksimek/node-mssql/tree/v3.3.0#multiple-connectionsのmssql npmパッケージを使用しています。

私は(基礎となるLIB)退屈でMicrosoftのドキュメントのドキュメンテーションを見てきた

(上記githubのリンクを参照してください)

私はgetCurrentConnection、またはgetConnectionStatusまたは類似のもののような単純な何かをする何かを見つけることができませんでした。

私はこの問題を解決する2つの方法を持っていましたが、私は両方に満足していないので、ここで尋ねています。

私の最初のアプローチは、タイムアウトを設定し、connect関数が各catch(err)で自分自身を呼び出させることでした。

2番目はミドルウェアでこれを処理することでしたが、すべて正常に動作していれば、すべての要求に対してSQLに接続し、その接続を再び閉じます。

私のミドルウェア機能:

api.use(function(err, req, res, next){ 
    sql.close(); 
    sql.connect(config.database).then(() => { 
    next(); 
    }).catch(function(err) { 
    sql.close(); 
    server.main(); 
    }); 
}); 

PSはので、私は、可能な場合には代わりに、決算の接続をピックアップし、サーバまたは私はまだデシベルがクラッシュする場合に関して新しいものを開始したい明確にしますexcisting関数のデータがあります。

私は十分にはっきりしていました。

答えて

1

アーノルドの助けを借りて、私はmssqlパッケージを理解することができました。

私は私の問題に次の解決策を考え出しました。

let intervalFunction; 
const INTERVAL_DURATION = 4000; 

if (require.main === module){ 
    console.log("Listening on http://localhost:" + config.port + " ..."); 
    app.listen(config.port); 
    // try to connect to db and fire main on succes. 
    intervalFunction = setInterval(()=> getConnection(), INTERVAL_DURATION); 
} 

function getConnection() { 
    sql.close(); 
    sql.connect(config.database).then(() => { 
    sql.close(); 
    clearInterval(intervalFunction); 
    main(); 
}).catch(function(err) { 
    console.error(err); 
    console.log(`DB connection will be tried again in ${INTERVAL_DURATION}ms`) 
    sql.close(); 
    }); 
} 

最初の接続が行われた後、それはプールが自動的に接続をピックアップし、あなたの接続を処理しますその間に失われてしまった

0

私はあなたを正しく理解していれば、基本的に接続を再利用したいと思っています。退屈は組み込まれているコネクションプーリング、あなたは再使用してそれらを心配する必要はありませんので:

var config = { 
    user: '...', 
    password: '...', 
    server: 'localhost', 
    database: '...', 
    pool: { 
     max: 10, 
     min: 0, 
     idleTimeoutMillis: 30000 
    } 
} 

(ちょうどあなたが投稿したのGitHubのURLからコピーされた)上記の例では、10があるだろう使用準備ができているプール内の接続。美しさは次のとおりです。プールマネージャーはすべての接続の使用と再利用を処理します。つまり、アプリのニーズに応じて接続数が伸縮します。

あなたが言及したように、DBはどうなるのですか?接続ヘルスチェック:

内部的には、各接続インスタンスはTDS 接続の個別のプールです。新しいRequest/Transaction/Prepared Statementを作成すると、新しいTDS接続がプールから取得され、希望する操作のために予約済み が予約されます。アクションが完了すると、接続は がプールに戻されます。接続ヘルスチェックは組み込まれていますので、一度 デッド接続が検出されるとすぐに、新しい接続が に置き換えられます。

この情報が役立ちますようにお願いいたします。

+0

こんにちはアーノルド、あなたの迅速な応答をありがとう、あなたはすべての記述のものあなたが接続されているという事実を告げる。しかし、私の質問では、時には私たちのAPIがDBの前に起動することを指定します。それについてどうやって行きますか?私が指定したミドルウェア機能ではない方法ですか?だから、キャッチ(エラー)を再試行し続けるか、タイムアウトのないクリーンな方法がありますか? – Knopfler

+0

このコードを使用すると、 'code' function getConnection(){ sql.close(); catch(function(err));sql.connect(config.database).then(sql.close(); main(); console.log( 'werkt wel'); } { sql.close(); はconsole.log( 'WERKのniet') のsetTimeout(()=> { のgetConnection()、2000年 }) })。 } 'code' そして、私はタイムアウト機能を停止するドッカーを起動してSQLサーバを起動します。ノードプロセスを再起動しても機能しますが、実行したくありません。 – Knopfler

+0

遅れて申し訳ありませんが、IMOには、このレースの状態を解決するための2つのオプションがあります(アプリケーション起動時にDBが準備できていません)。1)アプリケーションの起動に失敗しました。それは私が通常行うことです。それでは、起動スクリプトでこの問題を扱います。私の場合、DBの準備ができていなければ、アプリを起動することは絶対にありません(!)。 2)アプリがDBをポーリングし続けるようにして、dbが準備完了になるまで続けます。それもOKですが、DBが決して準備できなくなった場合、ある時点でこれが失敗する必要があります。それはあなたが下で行ったようです。 – arnold

関連する問題