Java 让内存中的更改与后端保持同步的好方法是什么
在多用户情况下,保持对资源的更改与内存和持久存储同步的好方法是什么?这里有两个想法,但都很笨拙 候选人A 这里,必须检索Java 让内存中的更改与后端保持同步的好方法是什么,java,design-patterns,Java,Design Patterns,在多用户情况下,保持对资源的更改与内存和持久存储同步的好方法是什么?这里有两个想法,但都很笨拙 候选人A 这里,必须检索r的副本,以便在put上同时更新内存状态和持久状态 Resource r = resources.getDeepCopyOfResourceById("foo"); r.removeValue("bar"); resources.put(r); 候选人B 这里,更新操作位于服务级别上。在我看来,这是一种面向对象的反模式 Resource r = resources.getRe
r
的副本,以便在put
上同时更新内存状态和持久状态
Resource r = resources.getDeepCopyOfResourceById("foo");
r.removeValue("bar");
resources.put(r);
候选人B
这里,更新操作位于服务级别上。在我看来,这是一种面向对象的反模式
Resource r = resources.getResourceById("foo");
resources.removeValue("foo", r);
有更好的设计方法吗
保持对资源的更改与两者同步的好方法是什么
多用户情况下的内存和持久存储
一般来说,这里有两个问题:缓存和并发
对于缓存,您需要决定使用什么策略。有很多选择。例如:
- 通读/通读
- 到处写
- 写在后面
- 缓存在一边
确定缓存模式后,下一步是使缓存和持久数据访问线程安全。这通常通过事务和锁来实现。具体的实现取决于您使用的库。这是单线程的吗?后端的单个用户?如果不是,候选人A很活泼,会导致更新丢失。@MarkoTopolnik好问题:多用户。候选A可以使用
version
或generation
属性来避免覆盖状态的较新版本。如果需要原子性,只需使用资源即可。removeValue
是最佳方法。如果您认为这是一个漏洞百出的抽象,那么版本控制和生成只会让它变得更糟。