我在通过RMI接收的POJO的独立应用程序中实现缓存。接下来是问题所在。假设我们有两个人在同一家公司。
class Company {
Long id;
List<User> users;
}
class User {
Long id;
Company company;
}
// + getters & setters
// CLIENT:
// get persons from server via RMI
User user1 = server.getEntity(User.class, 1);
User user2 = server.getEntity(User.class, 2);
assertEquals("Companies not the same instance!" , user1.getCompany(),user2.getCompany());
问题:在RMI中反序列化后,我们得到两个不同的公司实体实例。如果用户上的公司发生更改,则不会从其他用户看到更改,因此我们无法缓存此类对象。每个对象必须只有一个实例。
想法:每次加载实体时,检查它是否已经在缓存中。如果是,则将所有值复制到缓存实例,因此我们保留所有引用。对于加载的实体的关系,递归地执行相同的操作。 这样,我们在缓存中始终只有一个实体实例并保留其所有引用。有没有更有效的方法呢?是否有任何图书馆已经解决了这个问题?
提前致谢。
答案 0 :(得分:0)
即使你在服务器端使用缓存,RMI仍会序列化对象,所以在客户端你仍然会得到一个新的对象实例。
这种方法没有任何问题,因为无论如何detached entities应该如何工作。使用optimistic locking approach should prevent data consistency issues。