共有Java同期ブロック全体クラスターを使い、グローバルロック?
-
22-07-2019 - |
質問
しているのか教えてくださいコードしたいのみアクセスを許可する。しかそのために利用 synchronized
ブロックや方法が、この作業が集積す。
されることがありますので、あらかWebSphere6.0、2つのノードのクラスター
っているような気がする synchronized
なお、各インスタンスの各ノードにおいても重要なのは、JVMですか。
私としてはこちらを実行するデータベース内のレコードがシステムの起動.でないデータベースに記録を残している以上そのバージョンのコードは、特定のタスクを実行を更新します。またいつのノードを行うげていたことを確信するために各項目は更には、一度の更新ではない大きな懸念であることができることをアプリケーションの起動では何がされているコードを変更し、昨年始まります。
データベースをDB2v9、私はアクセスから直接JNDI(ORM層)
出来ることが指摘されており、グローバルロックが、ここでは、がんがどのようになる。
いてのポインタがこのアリーナ?
よろしく!
解決
Java同期コンストラクトを使用すると、プロセス間の同期が機能しないことは正しいです。幸いなことに、あなたの問題はコードの同期の問題ではなく、データベースとの対話を同期することです。
この問題に対処する正しい方法は、データベースレベルのロックです。おそらく、dbスキーマバージョンを含むテーブルがあるので、起動/アップグレードプロセスの間、そのテーブルを必ずロックする必要があります。
データベースタイプ(DB2?)とアクセス方法(raw sql、jpaなど)を指定した場合、関連する正確なsql / db呼び出しはおそらくより明確になります。
更新(8/4/2009 2:39 PM): LOCK TABLE ステートメントは、スキーマのバージョン番号を保持しているテーブルにあります。これにより、そのテーブルへのアクセスがシリアル化され、2つのインスタンスが一度にアップグレードコードを実行できなくなります。
他のヒント
あり、正確であること 同期 ブロックな活動にも、クラスターその理由として、それぞれのノードには独自のJVMを装備しています。
が、しかし、同期ブロックをクラスターという単一のノード環境です。最も簡単な方法は、製品の使用または使用い テラコッタ, は、の調整のスレッドと異なるJVMsように通常の並行処理制御できるためのクラスター多くの記事を説明するかがこの作品のように、 入門OpenTerracotta.
ある他のソリューション。で主によって異なりまを達成していきたいと思います。ない利用データベースのロックを同期化が必要な場合規模DBとしては来ない。がんをご一読いただくよう強くお勧めぐる既製のソリューション、いろなクラスターの同期が汚業)
http://www.hazelcast.com/これも。これは、ロックをサポートする分散データ構造です。
2台のマシンについて話しているので、共有メモリさえ持っていないので、同期するものは何もありません。
データベースで同様のことを行います。これは、テーブルにレコードのバージョン管理を追加することで実現されます。これがあなたがすべきことです
- レコード/行バージョンの列を追加します。
- レコードを更新する必要があるかどうかを確認するロジックを実行します。
- レコードを更新するときは、DBのレコードバージョンが現在のものと同じであることを確認してください。
- データベースに書き込むたびにバージョンを上げます。
これらのルールに従う場合、データベースを更新するサーバーは1台のみです。
更新のためにテーブル(またはdb全体)を単にロックできなかったので、最初のノードがロックを取得したとき、他のすべてのノードは書き込みできません。後続のノードは待機し、ロックが解除されるとコードが更新されるため、レコードの更新は必要ありません。