0

データベースに永続化されているオブジェクトのさまざまなライフサイクル イベントを処理する方法について、この混乱がありました。これは設計によって異なる可能性があることは承知していますが、そのような場合に従う標準/ベストプラクティスを知りたいです。

Userこのようなクラスがあるとしましょう-

class User {
  int id;
  String name;
}

このタイプのオブジェクトは、データベース内の行を表します。オブジェクトは複数のスレッドによってアクセスされます。では、オブジェクトをどのように管理しますか? その方法は何ですか?そのようなオブジェクトの削除をどのように実装しますか?

同じユーザー オブジェクトにアクセスしている 2 つのスレッド A と B があるとします。

// Thread A
User user = UserFactory.getUser(userId);

// Thread B
User user = UserFactory.getUser(userId)
user.delete(); // Or UserFactory.delete(userId)

userでは、スレッド A のオブジェクトはどうなるでしょうか。明確化は非常に役立ちます。

ありがとう!

4

2 に答える 2

1

次に、スレッド A のユーザー オブジェクトはどうなるでしょうか。明確化は非常に役立ちます。

何もない。もちろん、それはおそらくあなたの問題です。削除後にスレッドに永続化しようとするとどうなるかAは、おそらく使用している ORM に大きく依存しますが、Hibernate を使用していると仮定すると、スレッドでUPDATE/DELETEのオープンは行がない。これは頻繁に発生します。SessionA

Aユーザーオブジェクトが永続化/削除されない限り、スレッドはいつでもエラーなしでユーザーオブジェクトを自由に変更できることに注意してください。エラーは、永続化/削除するときにのみ発生します。この場合、最初に永続化/削除した人が勝ちます (エラーなし)。

人々はさまざまな方法でこの問題を軽減しています。

  1. 黙って例外を飲み込み、オブジェクトを再挿入するか無視する
  2. 例外 (通常は楽観的ロック例外) を昇格させ、ユーザー フレンドリなエラーに変換します。
  3. そもそも削除を許可しないでください。ブール列を使用して削除を示します。
  4. ORM の楽観的ロックと同期して、アプリケーションに楽観的ロックを実装させます。
  5. トランザクションおよび/またはsynchronized(単一の JVM)を使用する
  6. トランザクションと行ロックを使用しSELECT ... FOR UPDATEます。

ほとんどの場合、2 番または 3 番を使用します。数5は最も悲観的であり、多くのリソースを必要とし、デッド ロックの可能性があります。

于 2013-05-29T20:16:27.433 に答える
1

私が理解していることから、スレッドがオブジェクトにアクセスする限り、同期/ロックが使用されていない限り、両方が同じオブジェクトにアクセスできることを意味します。

疑似コードから収集できることから、オブジェクトを削除すると、システムから完全に削除されます (それにアクセスしているスレッドを含む) が、削除方法に依存すると思います。スレッド自体内でオブジェクトを削除すると、そのスレッドからのみ削除されますが、スレッド外でオブジェクトを削除すると、システム全体からオブジェクトが削除されます。

あなたのコードから、スレッド B 内のオブジェクトを削除しようとしているのか、コードの残りの部分でオブジェクトを削除しようとしているのかを判断するのに苦労していますが、どちらを達成しようとしていても、上記の説明がお役に立てば幸いです。

于 2013-05-29T19:52:03.063 に答える