在独立应用程序中高效缓存Hibernate分离对象?

时间:2015-08-08 13:14:12

标签: java hibernate jpa caching jboss

服务器: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.

是否可以优化仅删除已更改的对象甚至更新已更改的字段?有没有解决这个问题的库?

修改:更改公司地址以更清晰

1 个答案:

答案 0 :(得分:0)

如果可能,您可以使用第二个地图(缓存)作为地址并单独保留。当您获得Person的新实例时,您可以读取Address并在AddressCache中进行检查。 它比每次清除缓存或检查缓存中的所有人员便宜得多。你也摆脱了重复的地址