2013-01-31 14 views
5

Designing J2EE Applications for Real-Life Clustered EnvironmentsJavaの静的変数は

この記事では、クラスタ環境でのJavaの静的変数を使用することはできませんと述べたが、我々は機能のような静的変数を使用する場合(クラスタ化された内のすべてのオブジェクトが共有する価値の唯一のコピーアプリケーション)何を使うべきですか?

+0

この記事は2004年に書かれたものですが、一部の内容はまだ真ですが、私はこれを参考にしません。 –

+0

不変の内部クラスを「すべてのオブジェクトが共有する値のコピーを1つだけ」とみなしたい場合があります。 共有状態が基本データ型の場合、最終インスタンス変数は要件に合致する必要があります。 – spiritwalker

+1

操作中にデータが変更されない場合(たとえば、プロパティファイルをロードした場合)、 'static'を使用できます。唯一の欠点は、2回(各JVMごとに1回)初期化する必要があることです。データが変更されている場合は、変更を追跡するためにいくつかのレプリケーション方法を使用するか、データベース、memcacheなどのような「真実の単一のソース」を持っている必要があります。 – gaborsch

答えて

4

静的変数には、1つのクラスローダーでロードされた1つのJava仮想マシンのみがアクセスできます。この値を複数のJVMに共有する必要がある場合は、データベース、キャッシュ(memcached、redis)、または他の外部システムを使用できます。

+0

私たちは常にPublic Static Final修飾子を使用して定数を宣言します。クラスタ環境では、この定数にアクセスできるJVMは1つだけなので、これを定数宣言に使用しないでください。 – user1169587

+1

定数には問題はありません(すべてのノードに定数の「コピー」があります)が、「静的」な変数(最終的なものではない)がある場合は変更でき、同じ値になりますすべてのクラスからの読み込みごとに(スレッドを使って作業しているときに値がローカルにコピーされるというわけではありませんが)、ただ1つのJVMからです。分散アプリケーション(リモートEJBなど)を使用している場合は、そのJVM内の値を「ローカル」に変更します(すべてのJVMで変更されることはありません)。 – greuze

0

@Stateful豆を@javax.enterprise.context.ApplicationScopedで試すことができます。

私はこれを試していませんが、GlassFish 3.1がサポートしているはずです(少なくともドキュメントはそれを否定しません)。