1

2 つのサーバーを含むクラスターにアプリケーションをデプロイしています。次を使用して属性を設定すると:

this.getServletContext().setAttribute("test", testObj);
  1. testObjキーを持つ属性は、test両方のサーバーを介してアクセスできますか?
  2. サーバーの数は JVM の数と同じですか? 私の場合、サーバーが 2 つあるということは、JVM が 2 つあるということですか?
  3. 私の理解によると、ServletContextは JVM ごとの webapp ごとに 1 つであるため、私の場合、testObj両方の JVM を介してアクセスすると利用可能になりますか?
4

1 に答える 1

2

ServletContext javadocによると:

デプロイメント記述子で「分散」とマークされた Web アプリケーションの場合、仮想マシンごとに 1 つのコンテキスト インスタンスが存在します。この状況では、コンテキストをグローバル情報を共有する場所として使用することはできません (情報が真にグローバルではないため)。代わりに、データベースなどの外部リソースを使用してください。

サーブレット仕様は、「SRV.4.4.1 分散コンテナー内のコンテキスト属性」にも記載されています。

コンテキスト属性は、それらが作成された JVM に対してローカルです。これにより、ServletContext 属性が分散コンテナー内の共有メモリ ストアになることを防ぎます。分散環境で実行されているサーブレット間で情報を共有する必要がある場合、情報をセッション (SRV.7 章「セッション」を参照) に配置するか、データベースに格納するか、Enterprise JavaBeansTM コンポーネントに設定する必要があります。

したがって、質問に対する答えはノーです。属性はクラスター全体でアクセスできず、ローカル JVM でのみ使用できます。

サーバーごとの JVM の数については、基本的なセットアップでは、物理マシンごとに JVM を持つことができますが、アプリケーションの特性に応じて、またはハードウェアの使用を最大化したい場合は、同じマシン上により多くの JVMを配置することもできます。

于 2012-10-10T20:12:38.053 に答える