3

アプリケーションが実行されているドメインに基づいて、ASP.net で SessionState に使用される sqlConnectionString を変更できるかどうか疑問に思っていました。

シナリオ; 1 つのアプリケーションから実行されている 20 のサイトがあり、すべてが閲覧元のドメイン (サイト) に応じて異なるデータベースと通信しています。

www.domain1.com を参照すると、アプリケーションはデータベース 'db1' と通信します。一方、サイト www.domain2.com はデータベース 'db2' などと対話するため、関連するコンテンツが選択され、1 つのマスター データベースを使用してサイトのすべての接続を処理するのではなく、各データベースに負荷が分散されます。

ただし、発生した問題 - このセットアップでは、SessionState に SqlServer モードを使用するため、すべてのサイト セッションへのすべてのユーザーが 1 つの aspstate データベースに格納されます。サイトがビジー状態になり、サイトの数が増えると、このデータベースを処理する負担が増大します。すべてのサイトのすべてのセッション リクエストと、このデータベースへの接続がボトルネックになっているタイムアウト エラーが発生し始めています。

サイトを独自のアプリケーションから分離し、同じコードで異なるアプリケーションをセットアップできますが、各アプリケーション内で各 Web.Config に異なるセッション データベースを設定することで、負荷を軽減できます。ただし、このタスクにはかなりの時間がかかり、長期的にはより多くの管理が必要になります。SO ..セッションオブジェクトが作成される前に、ドメインに基づいてSessionStateに使用されるsqlConnectionStringをコード内で変更できるかどうかを知りたいですか? System.Web.HttpApplication から継承し、Application_AcquireRequestState イベントを使用して、HttpSessionState オブジェクトの必要なセットアップを作成できますか?

うまくいけば、これは理にかなっており、誰かがいくつかの指針を提供して、これが夢物語ではないことを証明してくれることを願っています!

乾杯、スティーブ

4

7 に答える 7

2

あなたの問題は、データベースへの接続がボトルネックになっているということではなく、すべてのセッションからのデータでデータベースへのネットワーク接続を圧倒しているということです。

既定では、Sql Server 状態プロバイダーは単にデータをシリアル化し、データベースに送信します。これは非常に非効率的で、高速ネットワークでの転送には長い時間がかかります。

この問題は、セッション コンテンツを圧縮してからデータベースに送信するDOTSSなどのカスタム プロバイダーを利用することで解決しました。圧縮率は 80% ~ 90% で、圧縮時間は 10 ミリ秒未満です。

于 2009-06-13T14:50:36.497 に答える
2

私はあなたが大きなポイントを見逃していると思います-同じサーバー上の別々のデータベースに物を置いても、ボトルネックがSQLサーバーである場合、まったく役に立ちません-SQLがヘッドルームを使い果たしているか、ネットワークが使い果たしています帯域幅。何かをする前に、それがどれであるかを理解しようとしました。

于 2009-06-13T14:54:01.730 に答える
0

カスタム セッション状態プロバイダーを実装できます。詳細については、 MSDNを参照してください。やったことはありませんが、少し運が良ければ、SqlServer セッション状態モジュールをラップして、ドメインに基づいてリダイレクトできます

于 2009-06-13T12:20:08.717 に答える
0
  • まず第一に、「セッション オブジェクトが作成される前に、ドメインに基づいて、SessionState に使用される sqlConnectionString をコード内で変更できるかどうか知りたい」という利点がありません。 web.config.
  • 次に、App_Start で接続文字列の設定を変更する必要があると思います。そのため、すべてのリクエストで変更された設定が使用されます。Application_AcquireRequestState はおそらくこれには遅すぎます。
于 2009-06-13T12:23:28.677 に答える
0

サイトを別々の Web アプリケーションに分割し、ホストヘッダーを使用して Web サイトを区別しないでください。そうすれば、Web アプリケーションで使用するセッション データベースを簡単に構成できます。これは、Web アプリケーションごとに個別の web.config ファイルがあるためです。

于 2009-06-13T12:57:28.750 に答える
0

IPartitionResolverを実装し、ドメインごとに異なるパーティションを使用することで、異なるデータベース間でセッションを分割できます。

カスタム パーティション リゾルバーを実装する方法を示す例を次に示します。(例ではセッション ID ごとに分割していますが、代わりにドメインごとに分割するように変更するのは簡単です。)

于 2009-06-13T13:16:42.463 に答える
0

プロジェクトのメイン Web.Config を介してデータベース接続が処理される数十の開発サイトがあります。

イントラネットの各 URL に対応する個別の構成セクションがあります (例: http://development11http://development12 )。同様の命名規則 (DEVDB1\SQL1、DEVDB1\SQL2) を持つ SQL インスタンスがあります。

イントラネット IIS サーバーで構成された URL に基づいて、アプリは適切な構成を取得します。テストのために、特定のサイトで使用されるユーザー、データベース サーバー、または個々のデータベースを簡単に変更できます。

于 2009-06-13T14:35:02.993 に答える