我对如何处理对象的不同生命周期事件(它们保存在数据库中)感到困惑。我知道这可能会因设计而异,但我想知道在这种情况下遵循的任何标准/最佳实践。
假设我有一个像这样的User
类 -
class User {
int id;
String name;
}
这种类型的对象代表数据库中的一行。这些对象由多个线程访问。那么,如何管理对象呢?其方法有哪些?如何实现删除这样一个对象?
假设有两个线程 A 和 B 正在访问同一个用户对象。
// Thread A
User user = UserFactory.getUser(userId);
// Thread B
User user = UserFactory.getUser(userId)
user.delete(); // Or UserFactory.delete(userId)
那么线程 A 中的 user
对象会发生什么情况呢?任何澄清都会非常有帮助。
谢谢!
最佳答案
Then what happens to the user object in thread A? Any clarification would be very helpful.
什么都没有。当然这可能是你的问题。如果您在删除后尝试在线程 A
中保留,会发生什么,这可能高度依赖于您正在使用的 ORM,但我猜测假设您使用 Hibernate,它会在尝试执行 UPDATE 时失败/DELETE
因为线程 A
中打开的 Session
不知道该行丢失。这种情况经常发生。
注意,线程A
将始终能够自由地改变用户对象,而不会出现错误,只要它不持久/删除。仅当您继续/删除时才会发生该错误。在这种情况下,谁先坚持/删除谁就获胜(没有错误)。
人们通过多种方式缓解这个问题:
- 默默地接受异常并重新插入对象或忽略
- 提升异常(通常是乐观锁定异常)并转换为用户友好的错误。
- 从一开始就绝不允许删除。使用 boolean 列来指示删除。
- 使您的应用程序实现与 ORM 乐观锁定同步的乐观锁定。
- 使用事务和/或
同步
(单个 JVM) - 使用事务和行锁定
SELECT ... FOR UPDATE
。
在大多数情况下,我会选择数字 2 和/或 3。数字 5
是最悲观的,需要大量资源,并且有可能出现死锁。
关于java - 我应该如何处理对象关系映射中对象的删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822428/