从Map中读取对象而不是数据库Java性能问题

时间:2017-10-24 09:41:47

标签: java arraylist hashmap

我有以下实体:

    //metadata...
    public class Article{

        //properties...

      private Set<Field> fields;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "field", orphanRemoval = true)
            public Set<Field> getFields()
            {
                return this.fields;
            }

        }

我的问题是我获取所有文章的服务需要花费很多时间,因为每个Article对象都有一个包含200个Fields对象的列表,这是我的代码:

//this service toke a lot of time, beacause it load the Object Article and it list of Fields objects
listOfArticles = service.getArticles();

//loop through listOfArticles to construct a map of fields from the list
for (Article article: listOfArticles) {

//this service construct a map of fields for each Article
Map<String, String> mapFields = service.constructMap(article);

//...some code
}

我的想法是,在实体文章中,我想破坏与属性字段的关联(删除属性字段),并在一个大地图中加载所有Fields对象(来自数据库)(该地图可能包含1M对象)应用程序启动时 然后在我的循环中,我将直接从数据库的大地图insitead中读取字段列表。 这会对我有用吗,我可以缩短响应时间吗? 我的想法是改善绩效的一个很好的解决方案吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

加载整个表永远不是一个好主意,我会建议一些点来提高你的表现。

  • 为数据库结果创建分页
  • 如果可能,只加载文章并在列表或您正在展示的地方显示属性
  • 当您转到文章时,请加载此特定文章的详细信息(字段)
  • 将已加载的字段放入地图中,当您尝试访问文章时,首先验证您是否已经在内存中,如果没有,则转到数据库。

每次都可以尝试使用延迟加载来提高系统性能。请记住,这样做可能会提高你的表现,但另一方面你会使用更多的记忆,也许你可以考虑使用列出的3个第一点。