0

私のサーバーには weblogic クラスタ ejb2 アプリケーションがあります。他のユーザーが同時に作成、更新、および削除する DB にこのテーブルがあります。

私のクライアント マシンには、リッチ クライアント Java アプリケーションがあります。変更の差分更新を送信しながら、テーブルの一貫した常に正しいビューを維持するにはどうすればよいですか? (したがって、失われた更新はありません。失われた更新が検出された場合、ビューを再同期するために回復メカニズムが必要になります)

Subversion グローバル リビジョン番号のアイデアを考えましたが、アプリケーションがクラスター上にあるため、実装方法がわかりません。

それをどうやって進めるかについて何か考えはありますか?

アプリケーションに含まれる EJB の種類は?
ステートレス セッション Bean

他のユーザーはこのテーブルにどのようにアクセスしますか?
jdbc接続を使用したステートレスセッションBeanを介したApache httpclientからJSPへ

その更新はどこで失われますか?
各クライアントは、起動時にテーブル全体のプルを実行します。デルタ情報の後続の更新は、リッチ クライアントにプッシュされます。失われた更新は、クライアント A が情報を取得しようとしていて、クライアント B がテーブルを編集しているときに発生します。クライアント B の編集は、クライアント A にプッシュされる差分情報で構成されているため、より早く到着する可能性があります。クライアント A は完全なテーブルを受信して​​いないため、デルタ情報を破棄します。

4

1 に答える 1

1

まだわかりませんが、楽観的ロックを使用して同時実行制御を実装することをお勧めします(他の戦略については記事全体を参照してください)。楽観的ロックは非常に簡単に実装できます。1つのオプションは次のとおりです。

ソースを一意の識別子でマークします。ソースデータ行は、更新されるたびに一意の値でマークされます。更新の時点でマークがチェックされ、最初に読み込んだ値とは異なる値がある場合は、ソースが更新されていることがわかります。

インクリメンタルカウンターの使用は、可能な同時実行マークの1つです。アイデアは、エンティティにバージョン番号を追加し、保存するたびにバージョン番号をインクリメントすることです。

VERSION_NUM=nのレコードを読み取った画像。次の更新要求が失敗した場合:

UPDATE T 
SET VERSION_NUM = VERSION_NUM + 1 [,column_name = value ...] 
WHERE VERSION_NUM = n [AND ...]

次に、編集中に誰かがすでにレコードを更新しています。

于 2009-10-28T02:25:23.120 に答える