0

バックエンド ストレージ用に MS SQL データベースに依存するクライアント/サーバー アプリケーションがあります。サーバー アプリケーションは、データベースの一連の情報から選択してクライアントの要求を処理する WCF TCP サービスです。

このサービスは PerSession として構成され、500 セッションをサポートします。クライアント側では、ユーザーは異なるビューを開くことができます。各ビューにはサービスのオブジェクト (プロキシ オブジェクト) があるため、各ビューはセッションです。各ビューには、プロキシ オブジェクトを使用して毎秒サーバーからデータを要求するスレッド タイマーがあります。

アプリケーションは、8 つのビューを持つ少数のユーザーに対して適切に実行されていますが、数を増やすと、接続プールに利用可能な接続がないため、SqlConnection.Open でタイムアウト例外が発生しました。

WCF サービスはスレッド セーフではないため、ビューごとにセッション/オブジェクトがあります。これは、SqlDataReaders と SqlAdapters を使用するシングル スレッド データベース アクセス レイヤーに依存します。

データベース接続の数を増やす方法はありますか? 800が最大らしいです!! あなたの観点から、どうすればユーザー数を増やすことができますか?

DB レイヤーを変更してマルチスレッド化し、WCF サービスをシングル化しますか? これが設計上のボトルネックだと思います (ADO.net のマルチスレッドに関する記事をお勧めできますか)

PS:

データベースをメモリ内データベースまたはより高速なストレージに置き換えることはできますか?

回答によると:

メソッド呼び出しごとに接続を閉じるようにバックエンド サービスを変更しましたが、ユーザー数が増えるとレイテンシが増加する (1 秒以上) という同じ問題に直面しています。これは、データベース ソリューションを変更する必要があるということですか? 代替ソリューションは何ですか?

その後:

私は2つの解決策を試しました

  1. メソッド呼び出しごとに SQL 接続を開いたり閉じたりする
  2. 接続文字列の接続プールのサイズを増やします

しかし、ユーザー数を増やすと、どちらもレイテンシが発生します。同時に、SQL ポーファイラーでクエリを監視すると、各クエリに 20 ミリ秒以上かかることはないようです。

4

6 に答える 6

4

セッションごとにデータベース接続を開いたままにするのではなく、各クライアント呼び出しの最後にデータベース接続を閉じて、接続が接続プールに返されるようにします。(プール内では接続が完全に閉じられないため、再利用時に再接続するのは高速です。)

そうすれば、各セッションは、本当に必要な場合にのみ接続を使用します。特定の数のセッションに必要な接続数が劇的に減少し、アプリケーションはより多くのセッションを処理できるはずです。

また、セッションは接続を保持しないため、セッション数に絶対的な制限はありません。セッションが接続を必要としているときに利用可能な接続がない場合、利用可能な接続ができるまでしばらく再試行します。サーバーが本当に過負荷になっている (つまり、サーバーが処理できるよりも速くリクエストが来る) 場合にのみ、タイムアウト エラーが発生します。

于 2009-05-10T11:00:15.383 に答える
1

SQL Server 接続プール (ADO.NET) に関する記事を見つけたので、参考になるかもしれません。

SQL Server 接続プール (ADO.NET)

于 2009-05-11T07:49:50.337 に答える
1

最高の無料オンライン マルチスレッド ブックの 1 つは、Joe Albahari のThreading in C# です。

Jon Skeet のMulti-threading in .NET: 紹介と提案も優れています

于 2009-05-10T10:47:10.750 に答える
1

以前のポスターに同意する必要があります。接続を閉じることを検討する必要があります。それまでの間、接続文字列で接続プールのサイズを指定できます: Max Pool Size

data source=RemoteHostName;initial catalog=myDb;password=sa;user id=sa;
Max pool size = 200; 
于 2009-05-10T18:01:53.280 に答える
1

積極的に接続を閉じます。接続、コマンド、データリーダーなどで IDisposable および .Close を呼び出すブロックまたは try/finally ブロックを使用して、IDisposible を実装するすべての ADO.NET コンポーネントのラッピングを再確認してください。

VISAやGoogleのような同時トランザクション数を持っている人でない限り、800のオープン接続は接続リークです。

于 2009-05-10T13:17:15.353 に答える
0

一連の実験の後、一連の変更により、システムのユーザー数を 800% 増加させました

  1. 接続プールのサイズを最大化する
  2. クライアント用の単一のプロキシ オブジェクトを作成し、要求を並列ではなくシリアルで送信します
  3. SQLクエリを最適化し、サービス側でキャッシュを使用します
于 2009-05-23T07:53:26.537 に答える