带有内存列表的Spring服务

时间:2018-10-18 10:04:40

标签: spring spring-boot

我想要一个保留列表内存的服务,所以我不需要每次都访问数据库。该服务由控制器访问。这是有效的方法还是我遗漏了一些东西?在这里并发访问(从控制器)怎么样?这(有状态服务)是反模式吗?

@Service
public class ServiceCached {
    private List<SomeObject> someObjects;

    @PostConstruct
    public void initOnce() {
        someObjects = /** longer running loading methodd **/
    }

    public List<SomeObject> retrieveObjects() {
        return someObjects;
    }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

我不会称其为反模式,但是我认为以@PostConstruct方法从数据库中加载列表并不是一个好主意,因为这会减慢应用程序的启动速度,我是d宁愿使用延迟加载机制,但这可能会引入一些并发访问问题,需要解决。

在您的示例中,从控制器的并发访问应该不是问题,因为列表是通过@PostConstruct方法加载的,并且控制器将依赖于此服务,因此,在此服务需要完全构建之前注入到控制器中,因此该列表将已经加载。

最好建议使用Spring Caching:Caching Data with SpringDocumentationUseful guide

用法示例:

@Cacheable("books")
public Book getByIsbn(String isbn) {
    simulateSlowService();
    return new Book(isbn, "Some book");
}

这样,您就无需照顾对象的装载和撤离。设置完成后,缓存框架将为您解决这个问题。