我想要一个保留列表内存的服务,所以我不需要每次都访问数据库。该服务由控制器访问。这是有效的方法还是我遗漏了一些东西?在这里并发访问(从控制器)怎么样?这(有状态服务)是反模式吗?
@Service
public class ServiceCached {
private List<SomeObject> someObjects;
@PostConstruct
public void initOnce() {
someObjects = /** longer running loading methodd **/
}
public List<SomeObject> retrieveObjects() {
return someObjects;
}
}
谢谢!
答案 0 :(得分:2)
我不会称其为反模式,但是我认为以@PostConstruct
方法从数据库中加载列表并不是一个好主意,因为这会减慢应用程序的启动速度,我是d宁愿使用延迟加载机制,但这可能会引入一些并发访问问题,需要解决。
在您的示例中,从控制器的并发访问应该不是问题,因为列表是通过@PostConstruct
方法加载的,并且控制器将依赖于此服务,因此,在此服务需要完全构建之前注入到控制器中,因此该列表将已经加载。
最好建议使用Spring Caching:Caching Data with Spring,Documentation,Useful guide
用法示例:
@Cacheable("books")
public Book getByIsbn(String isbn) {
simulateSlowService();
return new Book(isbn, "Some book");
}
这样,您就无需照顾对象的装载和撤离。设置完成后,缓存框架将为您解决这个问题。