java如何处理对象关系映射中对象的删除
我对如何处理对象的不同生命周期事件感到困惑,这些事件在数据库中被持久化。我知道这可能因设计而异,但我想知道在这种情况下遵循的任何标准/最佳实践
假设我有一个这样的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
对象会发生什么情况?任何澄清都会很有帮助
谢谢
# 1 楼答案
据我所知,对于访问一个对象的线程来说,这是一种免费的方式,这意味着它们都可以访问同一个对象,除非使用同步/锁定
根据我从伪代码中收集到的信息,删除该对象将完全将其从系统中删除(包括访问它的任何线程),但我相信这取决于删除它的方式。如果删除线程本身内的对象,它应该只从该线程中删除该对象,但如果删除线程外的对象,它应该从整个系统中删除该对象
从我对你的代码的了解来看,我很难确定你是想删除线程B中的对象,还是在代码的其余部分删除它,但无论你想完成什么,我希望我上面的解释能有所帮助
# 2 楼答案
没什么。当然,这可能是你的问题。如果在删除后尝试在线程
A
中持久化,会发生什么情况可能在很大程度上取决于您正在使用的ORM,但我猜假设您使用Hibernate,那么它将无法尝试执行UPDATE/DELETE
,因为线程A
中的开放Session
不知道该行丢失。这种情况经常发生注意线程
A
总是能够自由地改变用户对象,而不会出错,只要它不持久/删除。只有在执行“持久化/删除”时,才会发生此错误。在这种情况下,第一个持久化/删除的人获胜(无错误)人们通过多种方式缓解这一问题:
synchronized
(单个JVM)SELECT ... FOR UPDATE
李>在大多数情况下,我选择2号和/或3号。Number
5
是最悲观的,需要大量资源,可能会导致死锁