私は永続化されたオブジェクトの単一のインスタンスに更新を同期するためのアイデアを探しています。プロパティの更新を単一のドメインインスタンスに同期させるにはどうすればよいですか?
単純なドメイン・オブジェクト:
public class Employee {
long id;
String phone;
String address;
}
と仮定2つのUIインスタンスが従業員(1)ID = 1を引き上げます。最初のクライアントはEmployee(1)のphoneプロパティを編集します。 2番目のクライアントはEmployee(1)のアドレスプロパティを編集します。彼らが変更を提出するときには、両方を維持する必要があります。
可能な解決策は、各プロパティの更新機能を作成するであろう:
public void updatePhone(Employee employee) {
// right now I am synchronizing _employeeUpdateLock
// synchronize instance of Employee won't work
synchronized(something) {
// update phone
}
}
// a similar function for address
この手法は、残念ながらうまくスケールしません。 APIは、常にプロパティにアライメントされる必要があります。元のオブジェクトのコピーが更新機能の中にプルアップすることができない限り、関数は、クライアントが変更しようどのプロパティ伝えることができないので、
public void update(Employee employee) { ... }
が動作しないことに注意してください。
Hibernateは、データベースに行をロックするメカニズムを提供します。これはうまくスケールされません。
おそらく解決策は、行が変更されることが予想される頻度に依存します。低周波数の変更の場合、同期とロックは正常です。高頻度の変更の場合、検索時の行のコピーを使用して、更新されたプロパティを把握することができます。
私はこの問題を解決するためのより良いパラダイムを見つけたいと考えています。ありがとう。
オブジェクトの1つのインスタンスを共有するのではなく、1つの行をデータベースに共有します。 –
申し訳ありませんが、私は結論を出す前に投稿全体を読む習慣を取るべきです。 ;-) あなたの問題については、これは基本的に楽観的対悲観的同時実行性の問題のように聞こえます。 Hibernateのドキュメントは、Hibernateでサポートされているアプローチと同様に、ここでそれをうまくまとめています:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-optimistic – chris