2011-01-25 18 views
0

複数のDBサーバーがあります。いずれかのサーバーには、代理店が使用する予定のDBサーバー名とデータベース名についての指示を保持するマスター構成表があります。SQL接続の断片化、DBへの接続方法が異なります

現在、各データベースには、常に(私たちが固定されている)、彼らが使用されていない場合でも、それらの上に2つの接続があります。しかし、私たちは接続を完全にはしないようにする方法を見つけようとしており、DBサーバーへのストレスを軽減しています。

研究の多くは、我々は中央の場所にすべての接続を行うために言って、いくつかの記事を見つけ、その後、我々はSQLConnectionオブジェクトを通じて使用しているどのデータベースに変更した後。ちょっと回り道に見えますが、うまくいくかもしれません。

だから私は他の人がこのような状況で何をしているのだろうか?

このため、現在のパスは次のとおりです。 - システムアクセスConfigTableで

- ユーザログのユーザーが接続しようとしているデータベースを見つけるために。 - エージェントの接続設定をそのユーザーのメモリ(SEssion)にロードします。 - すべてのリクエストが、そのユーザーデータベースに直接ヒットするようになりました。

これを行うより効率的な方法はありますか?

答えて

1

接続を遅く開き、早く閉じます。例えば

string result; 
using (var con = new SqlConnection(...)) 
{ 
    con.Open(); 
    var com = con.CreateCommand(); 
    com.CommandText = "select 'hello world'"; 
    result = com.ExecuteScalar(); 
} 

のWindows OSは、効率的な接続をプールし、再利用することを確認します。また、必要なときにのみ接続を使用しているため、アイドル状態の接続が存在しません。

EDIT:あなたは1台のサーバーの500以上の「接続プール」を要求することにより、パフォーマンスを傷つける可能性があり、接続文字列でInitial Catalog=<dbname>を使用するので、もしWindowsのみ、文字通り同じ接続文字列をキャッシュします。

多くのデータベースを持つ4台のサーバーがある場合は、4つの接続文字列を使用するようにしてください。接続後、使用してスイッチデータベース:のような3部構成の名前で

com.CommandText = "use <dbname>"; 
com.ExecuteNonQuery(); 

またはクエリ:

select * from <dbname>.dbo.YourTable 
+0

は、我々のアプリは、.NET 2.0であり、これは私たちが現在使用しているものと同様です。あまりにも非効率的であることが証明されています。 –

+0

@Ryan Ternier:「それはあまりにも非効率的であることを証明しています」 - あなたは上の中央のDBへの接続を言っているので...より具体的に – Andomar

+0

@Ryan Ternierと少数のサーバのために編集した回答各サーバー(マスタまたは他のランディングポイントのような)は、接続の「データベースを変更する」ことをあなたが望むものにしますか?それはMSDNのページで調査されたものをバックアップします。初期カタログを使用せず、CSにDB名を持つ場合はどうなりますか?それはそれを別々にキャッシュさせるでしょうか? –

関連する問題