我对如何处理Object的不同生命周期事件感到困惑,因为它们被保存在数据库中。我知道这可能因设计而异,但我想知道在这种情况下遵循的任何标准/最佳实践。
说我有一个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
对象会发生什么?任何澄清都会非常有用。
谢谢!
答案 0 :(得分:1)
从我能从伪代码中收集的内容中,删除对象会将其从系统中完全删除(包括访问它的任何线程),但我认为这取决于您删除它的方式。如果删除线程本身内的对象,它应该只从该线程中删除它,但如果删除线程外的对象,则应将其从整个系统中删除。
从我看到你的代码,我无法确定你是否试图删除线程B中的对象或在其余代码中删除它,但无论你想要完成什么,我希望我的上述解释帮助
答案 1 :(得分:1)
那么线程A中的用户对象会发生什么?任何澄清都会非常有用。
无。当然这可能是你的问题。如果你试图在删除后坚持线程A
可能会高度依赖于你正在使用的ORM会发生什么,但我猜你假设你使用Hibernate会失败尝试UPDATE/DELETE
作为线程Session
中的open A
不知道该行丢失了。这经常发生。
注意线程A
将始终能够自由地改变用户对象而不会出现错误,只要它不会持久/删除。只有当你坚持/删除时才会发生错误。在这种情况下,谁首先持久/删除胜利(没有错误)。
人们以各种方式缓解这个问题:
synchronized
(单个JVM)SELECT ... FOR UPDATE
。在大多数情况下,我使用数字2和/或3.数字5
是最悲观的,需要大量资源并且可能存在死锁。