2016-11-07 145 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的非參數構造函數中保存了一些信息,因此對於從數據存儲區獲取的每本書,都會爲本書中引用的其他實體進行保存操作。