有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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对象会发生什么情况?任何澄清都会很有帮助

谢谢


共 (2) 个答案

  1. # 1 楼答案

    据我所知,对于访问一个对象的线程来说,这是一种免费的方式,这意味着它们都可以访问同一个对象,除非使用同步/锁定

    根据我从伪代码中收集到的信息,删除该对象将完全将其从系统中删除(包括访问它的任何线程),但我相信这取决于删除它的方式。如果删除线程本身内的对象,它应该只从该线程中删除该对象,但如果删除线程外的对象,它应该从整个系统中删除该对象

    从我对你的代码的了解来看,我很难确定你是想删除线程B中的对象,还是在代码的其余部分删除它,但无论你想完成什么,我希望我上面的解释能有所帮助

  2. # 2 楼答案

    Then what happens to the user object in thread A? Any clarification would be very helpful.

    没什么。当然,这可能是你的问题。如果在删除后尝试在线程A中持久化,会发生什么情况可能在很大程度上取决于您正在使用的ORM,但我猜假设您使用Hibernate,那么它将无法尝试执行UPDATE/DELETE,因为线程A中的开放Session不知道该行丢失。这种情况经常发生

    注意线程A总是能够自由地改变用户对象,而不会出错,只要它不持久/删除。只有在执行“持久化/删除”时,才会发生此错误。在这种情况下,第一个持久化/删除的人获胜(无错误)

    人们通过多种方式缓解这一问题:

    1. 默默地接受异常,然后重新插入对象或忽略
    2. 升级异常(通常是乐观锁定异常)并转换为用户友好的错误
    3. 从一开始就不允许删除。使用布尔列表示删除
    4. 让你的应用程序与你的ORM的乐观锁定同步实现乐观锁定
    5. 使用事务和/或synchronized(单个JVM)
    6. 使用事务和行锁定SELECT ... FOR UPDATE

    在大多数情况下,我选择2号和/或3号。Number 5是最悲观的,需要大量资源,可能会导致死锁