2010-07-20 84 views
3

我剛剛測試並將我的應用程序重新部署到測試實例,它工作正常,然後我更改了應用程序ID並重新部署到我的生產實例,並且出現索引問題。我將來如何避免這種情況?我去努力測試它,它工作得很好!爲什麼我在GAE中得到這個異常

Uncaught exception from servlet 
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found..  <datastore-index kind="Article" ancestor="false" source="manual"> 
    <property name="tags" direction="asc"/> 
    <property name="created" direction="asc"/> 
</datastore-index> 
at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:40) 
at com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(DatastoreApiHelper.java:67) 

管理控制檯說它是「建立」索引。它已經說了20分鐘吧!多久時間!?

回答

10

當你創建新的查詢,並使用它們首次在本地機器上,他們總是工作第一次。當您在Google應用引擎上首次運行這些新查詢時,它們將返回此異常,因爲Google應用引擎服務器需要一些時間來生成「索引」以允許您的查詢正常工作。

我會建議當你創建新的查詢,讓他們在生產環境中一次運行,以獲得「索引」內置,以便當你的用戶擊中他們,他們第一次工作。

其次,在你需要它們並將它們上傳到服務器之前手動預先定義你的查詢意味着當你真的需要它們時,它們可能已經建立在服務器上了。

+0

指標都是建立在索引定義文件,由SDK生成的,上傳到服務器。與SDK不同,生產環境在執行查詢時不會自動生成索引。 – 2010-07-21 07:15:20

+3

我通過將索引添加到WEB-INF/datastore-indexes.xml來解決此問題,如下所述:http://dnhome.wordpress.com/2011/10/07/google-apps-engine-write-first-queries-從數據存儲/ GAE中獲取實體提供了一個條目,在我的情況下是正確的。 – Herbert 2012-10-31 17:08:10

1

檢查index.yaml中的文件,並確保適當的指數有規定等

5

我解決這個問題的方法是爲我的應用程序保留許多版本。 通常是這樣的:

  • 1版:當前的默認
  • 2版:下一個版本

當我有一個新的版本可供部署,我把它上傳到版本2在這種情況下。一旦建立了索引,我就默認使用版本2。這樣客戶就不會遇到任何停機或錯誤。

因此,本質上,您可以在發佈新版本時在版本1和版本2之間進行切換。

我建議您在上傳到部署的「應用程序」之前,在不同的測試「應用程序」中進行預測試。

+0

我有非常相同的行爲:我有一個「測試版」版本,在此版本中,我部署了新的開發人員並在上傳到「prod」之前構建了所有需要的索引。我不需要「開關」,因爲索引是共享的。 – Sebastien 2014-04-04 12:52:41

2

發生這種情況是因爲應用程序引擎數據存儲索引未初始化,即corydoras的答案是正確的。我正在加入我對java的修復[我認爲python和index.yaml有一個類似的修復]。

您可以在https://appengine.google.com/上看到使用您的Google帳戶使用了哪些索引。單擊左側和左側菜單上的應用程序鏈接選擇數據下的數據存儲索引

當對數據存儲進行新查詢時,可能需要花費數小時才能更新數據索引。

首先,您應該知道,每當存儲新的「類」實體時,本地環境中的調試都會創建一個名爲datastore-indexes-auto-xml的文件。

在本地環境中,它可以立即用於查詢,但是在更新datastore-indexes-auto-xml時存在延遲。

將應用程序部署到appengine時,會提交自動生成的datastore-indexes-auto-xml,並且數據索引更新更快[查看結果刷新頁面]。

所以

  1. 確保不關你的實體有非法跡象如'&'。
  2. 在appengine.google.com上打開Data Indexes視圖。
  3. 確保你沒有刪除datastore-indexes-auto-xml。 [我經常這樣做]
  4. 存儲每個「Kind」的實體!
  5. 在查詢中使用所有「種類」!
  6. 確保datastore-indexes-auto-xml更新[我有時甚至重新啓動eclipse]
  7. 部署到appengine。
  8. 刷新數據索引在瀏覽器上查看。
  9. 等到看到索引enter image description here
  10. 請告訴Google解決這個問題。
  11. 這是言之有物,但對我來說沒有工作:enter link description here
  12. 這也是翔實,但對我沒有工作:enter link description here
相關問題