请考虑以下代码:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Foo {
public @Id int id;
public String bar;
}
public class FooDto {
public String bar;
}
public class FooService {
public FooDto getOne(int id) {
return toDto(fooRepository.findOne(id));
}
public List<FooDto> getAll() {
return fooRepositoy.findAll().stream()
.map(this::toDto)
.collect(toList());
}
private toDto(Foo foo) {
FooDto fooDto = new FooDto();
fooDto.bar = foo.bar;
return foo;
}
}
findOne()
和findAll()
的结果由Hibernate的二级实体和查询缓存缓存。
我还想缓存派生的FooDto
个对象/ getOne()
和getAll()
的结果。每当更新L2C中的实体时,都必须更新对象。
我的想法是通过挂钩Foo
@PostPersist
,@PostUpdate
和@PostRemove
来自行维护缓存。这可行吗?
这可以用Spring Cache完成吗?或者还有另一种好方法吗?
答案 0 :(得分:0)
在概念层面上回答更多问题,我不是Spring或者是hibernate的大师。
我的想法是通过挂钩Foo的@PostPersist,@ PostUpdate和@PostRemove来自己维护缓存。这可行吗?
这还不足以保证数据的一致性。
这也可能会使您的代码只能在单个JVM上运行。
还有一个假设,即只能通过休眠或应用程序更新数据库。
或者还有另一种好方法吗?
如果你依赖于一致性,(更好)不要做任何自己的缓存。
如果不需要一致性,最好是非常简单,并使用一段时间后自动刷新的缓存(写入后TTL /到期)。
除此之外,我可以理解这个要求,并希望看到一个很好的解决方案。然而,它有点像增加太多的复杂性并且过度工程化。