服务器:JBoss Application Server 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应用程序请求这两个对象并接收两个人员和一个公司实例。两人均参考同一公司。一切都好。
// 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.
是否可以优化仅删除已更改的对象甚至更新已更改的字段?有没有解决这个问题的库?
修改:更改公司地址以更清晰
答案 0 :(得分:0)
如果可能,您可以使用第二个地图(缓存)作为地址并单独保留。当您获得Person的新实例时,您可以读取Address并在AddressCache中进行检查。 它比每次清除缓存或检查缓存中的所有人员便宜得多。你也摆脱了重复的地址