2009-05-16 5 views
2

私はApacheでTWebModuleを使用しています。私が正しく理解するならば、以前に作成されたすべてのオブジェクトが処理要求を処理している場合、ApacheはTWebModuleオブジェクトの別のインスタンスを生成します。これは正しいです?TWebModuleでのセッション管理

私は自分のSessionObjectを作成し、それを格納するTStringListを作成しました。 StringListは、TWebModuleオブジェクトを保持するソースコードファイルの最後の初期化セクションに作成されます。私は初期化を複数回呼び出すことができます(おそらく、Apacheが別のプロセスを生成しなければならない場合)。

すべてのセッションオブジェクトを保持するためのグローバルな「セッション」TStringlistを持つ方法はありますか?または、セッション情報をデータベースに保存し、リクエストごとにCookieに基づいて検索する「安全な」適切な方法ですか?

私がこれを必要とする理由は、データベースアクセスを減らし、代わりにセッション情報をメモリに保持することです。

ありがとうございました。

答えて

2

Stijnが示唆したように、セッションデータを保持するために別のストレージを使用するのが実際には最良の方法です。 Webブラウザに本質的にデザインの状態が含まれるように、アプリケーションを作成することをお勧めします。これにより、はるかに少ないハードウェアで数千人または数万人の同時ユーザーにアプリケーションを拡張する能力が大幅に向上します。

Intrawebは素晴らしい選択肢ですが、IDLEユーザーでもより多くの同時ユーザーがサポートするにはより多くのハードウェアを必要とするという意味でスケール問題があります。サーバーの内部的な状態を可能な限り実行する方法を、最初から設計する方がはるかに優れています。もちろん、ユーザー数が固定されていて成長が見込まれない場合は、これは問題になりません。

1

これは奇妙です。初期化セクションが複数回呼び出されると、DLLが別のプロセス・スペースにロードされている可能性があります。私が考えることのできる1つのオプションは、初期化時に "セッション"オブジェクトが作成されているかどうかをチェックすることです。 DLLが別のプロセスで実際にロードされている場合、これは役に立ちません。次に、中央のセッションストレージプロセスを作成し、TWebModule内からプロセス間通信を使用することをお勧めします(メッセージ、名前付きパイプ、COM)。 ..)

+0

ごめんなさい。私は通知箱をチェックしたが、しなかったと思った。はい、私はそれは、DLLが再度読み込まれていると仮定する必要があります。今のところ私はセッション管理のためにバックエンドデータベースを使用します。 –

0

Intrawebは、アプリケーションモードでは、セッション管理とデータベースアクセスを非常にスムーズに処理し、うまくスケーリングします。 I've commented on it previously。これはあなたが尋ねた質問に直接答えるものではありませんが、同じ問題に直面したときにIntrawebが私のために解決しました。