服务器: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中对其进行检查。
它比每次清除缓存或检查缓存中的所有人员便宜。你也摆脱重复的地址