服务器:JBoss应用服务器7.1.4

JPA实施:Hibernate

外部独立Java应用程序通过RMI从EJB接收分离的实体。
如何在独立的Java应用程序中有效地缓存这些对象,并在保存/更新操作中尽可能多地保留它们?

现在,实体被缓存在Map<Long, Object> cache中。但是因为实体使用公共字段,所以我们必须在每个保存操作上清除整个缓存,否则我们将获得StaleObjectsException。

让我们看下面的例子:

class Company {
  Long id;
  String name;
}

class User {
  Long id;
  String name;
  Company company;
}
// + getters & setters


假设人员1和人员2都拥有相同的公司。
外部Java应用程序请求这两个对象,并接收两个Person和一个Company实例。两个人都引用同一家公司。都好。

// put to cache
cache.put(person1.getId(), person1);
cache.put(person2.getId(), person2);
// change company name of person1
person1.getCompany().setName("newCompany");

// now send person1 to server EJB to be saved to database.


EJB中的session.merge更新分离的实体并返回全新的java对象实例。我们将新实例保存到缓存:cache.put(returnedPerson1.getId(), returnedPerson1);

问题:缓存中的person2仍然有旧公司。

简单的解决方案:

cache.clear(); // on each save / update operation.


是否可以对其进行优化以仅删除更改的对象甚至更新更改的字段?是否有解决此问题的库?

编辑:更改为公司地址以更清楚

最佳答案

如果可能,您可以将第二个Map(缓存)用于Addresses并单独保存。当您获得一个Person的新实例时,您可以阅读Address并在AddressCache中对其进行检查。
它比每次清除缓存或检查缓存中的所有人员便宜。你也摆脱重复的地址

10-07 18:54
查看更多