バックエンド ストレージ用に MS SQL データベースに依存するクライアント/サーバー アプリケーションがあります。サーバー アプリケーションは、データベースの一連の情報から選択してクライアントの要求を処理する WCF TCP サービスです。
このサービスは PerSession として構成され、500 セッションをサポートします。クライアント側では、ユーザーは異なるビューを開くことができます。各ビューにはサービスのオブジェクト (プロキシ オブジェクト) があるため、各ビューはセッションです。各ビューには、プロキシ オブジェクトを使用して毎秒サーバーからデータを要求するスレッド タイマーがあります。
アプリケーションは、8 つのビューを持つ少数のユーザーに対して適切に実行されていますが、数を増やすと、接続プールに利用可能な接続がないため、SqlConnection.Open でタイムアウト例外が発生しました。
WCF サービスはスレッド セーフではないため、ビューごとにセッション/オブジェクトがあります。これは、SqlDataReaders と SqlAdapters を使用するシングル スレッド データベース アクセス レイヤーに依存します。
データベース接続の数を増やす方法はありますか? 800が最大らしいです!! あなたの観点から、どうすればユーザー数を増やすことができますか?
DB レイヤーを変更してマルチスレッド化し、WCF サービスをシングル化しますか? これが設計上のボトルネックだと思います (ADO.net のマルチスレッドに関する記事をお勧めできますか)
PS:
データベースをメモリ内データベースまたはより高速なストレージに置き換えることはできますか?
回答によると:
メソッド呼び出しごとに接続を閉じるようにバックエンド サービスを変更しましたが、ユーザー数が増えるとレイテンシが増加する (1 秒以上) という同じ問題に直面しています。これは、データベース ソリューションを変更する必要があるということですか? 代替ソリューションは何ですか?
その後:
私は2つの解決策を試しました
- メソッド呼び出しごとに SQL 接続を開いたり閉じたりする
- 接続文字列の接続プールのサイズを増やします
しかし、ユーザー数を増やすと、どちらもレイテンシが発生します。同時に、SQL ポーファイラーでクエリを監視すると、各クエリに 20 ミリ秒以上かかることはないようです。