2016-11-07 127 views
0

经过一些重构之后,我们在应用程序中使用的objectify查询出现问题。奇怪的是,即使我们恢复到原来的代码,问题仍然存在。Objectify查询速度很慢(Google Datastore)

当应用程序启动时,使用Objectify从数据存储库中提取大量250本书籍。缓存已启用,似乎正在工作。 问题是需要大约50-60秒才能得到结果,因此有时会导致http请求被终止。我们以前从未遇到过这个问题,我们无法找到答案。 如果我在Google数据存储控制台中运行了一个查询,例如“创建日期限制250”中的“从BookEntity订单中选择*”,并且它花费的时间不超过5到7秒。

重构之前,这本书实体看起来是这样的:

@Index 
@Entity 
@Cache 
public class BookEntity { 
    @Index 
    public String title_name; 
    @Index 
    public String author_name; 
    public String isbn; 
    public int number_of_pages; 
    public Ref<PdfEntity> book_pdf; 
} 

现在是这样的:

@Index 
@Entity 
@Cache 
public class BookEntity { 
    @Index 
    @AlsoLoad("title_name") 
    private String titleName; 

    @Index 
    @AlsoLoad("author_name") 
    private String authorName; 

    private String isbn; 

    @AlsoLoad("number_of_pages") 
    private int numberOfPages; 

    @AlsoLoad("book_pdf") 
    private Ref<PdfEntity> bookPdf; 

    // getters and setters for the fields because now they are private 
} 

这里仅仅是一个例子,但在现实中,它有大约20个领域。 为了将模式迁移到字段名称,我在GAE中运行了一个加载的任务,然后再次保存所有的BookEntity实体。

本示例可以扩展到应用程序中使用的所有实体,但该书是性能最差的一本书。即使查询中没有任何内容发生变化,我们正在讨论一个基本查询,它将通过creationDate获取最新的250本书籍,但需要一生才能获得实际结果。任何想法如何我可以进一步调查这个问题?

回答

1

发现问题。我们在BookEntity的非参数构造函数中保存了一些信息,因此对于从数据存储区获取的每本书,都会为本书中引用的其他实体进行保存操作。