为什么我在GAE中会遇到这个异常?

3

我刚刚测试并重新部署了我的应用到一个测试实例,它运行得很好,然后我更改了应用程序ID并重新部署到生产实例,结果出现了索引问题。如何避免这种情况在未来再次发生?我已经花费了精力先进行测试,而且测试结果是正常的!

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分钟了!需要多长时间!?

4个回答

10
当您创建新查询并在本地机器上首次使用时,它们总是第一时间可用。但是,当您在Google应用引擎上首次运行这些新查询时,它们将返回此异常,因为Google应用引擎服务器需要一些时间来生成“索引”以允许您的查询正常工作。
我建议在创建新查询时,在生产环境中对其进行一次一次性运行,以建立“索引”,这样当用户使用它们时,它们就能够第一时间正常工作。
另外,手动预定义您的查询,并将其上传到服务器意味着当您真正需要它们时,它们可能已经在服务器上构建好了。

索引是在由SDK生成的索引定义文件上传到服务器时建立的。与SDK不同,生产环境在执行查询时不会自动构建索引。 - Nick Johnson
3
我通过添加索引到WEB-INF/datastore-indexes.xml文件来解决这个问题,具体步骤可以参考这里:http://dnhome.wordpress.com/2011/10/07/google-apps-engine-write-first-queries-to-get-entity-from-datastore/ 在我的情况下,GAE给出的建议是正确的,需要在该文件中添加相应的条目。 - Herbert

5
我解决这个问题的方法是为我的应用程序维护多个版本,通常是这样的:
  • 版本1: 当前默认版本
  • 版本2: 下一个发布版本
当我有一个新版本准备好部署时,我将其上传到版本2。一旦索引建立完成,我会将版本2设为默认版本。这样,客户永远不会遇到任何停机或错误。
因此,在发布新版本时,您可以在版本1和2之间切换。
我建议您在上传到已部署的“应用程序”之前,也在不同的测试“应用程序”中进行预测试。

我有相同的行为:我有一个“beta”版本,在其中部署新的开发人员并构建所有所需的索引,然后再上传到“prod”。但是我不需要“switch”,因为索引是共享的。 - Sebastien

2
这是因为应用程序引擎数据存储索引未初始化,即corydoras的答案是正确的。我正在添加我的Java修复方法[我认为Python和index.yaml有类似的修复方法]。
您可以使用Google帐户在https://appengine.google.com/上查看哪些索引正在服务。单击左侧的应用链接,在左侧菜单中选择数据存储索引。
当向数据存储进行新查询时,数据索引更新可能需要几个小时。
首先,您应该知道在本地环境中调试会创建一个名为datastore-indexes-auto-xml的文件,每次存储新的“Kind”实体时都会创建该文件。
在本地环境中,它可以立即用于查询,但是在更新datastore-indexes-auto-xml方面存在延迟。
将应用程序部署到appengine时,自动生成的datastore-indexes-auto-xml将被提交,并且数据索引更新速度更快[要查看结果,请刷新页面]。
  1. 确保您的实体中没有非法符号,例如'&'。
  2. 在appengine.google.com上打开数据索引视图。
  3. 确保您没有删除datastore-indexes-auto-xml。[我经常这样做]
  4. 存储每个“种类”的实体!
  5. 在查询中使用所有“种类”!
  6. 确保datastore-indexes-auto-xml已更新[我有时甚至重新启动eclipse]
  7. 部署到appengine。
  8. 在浏览器上刷新数据索引视图。
  9. 等待直到您看到索引enter image description here
  10. 请告诉Google修复此问题。
  11. 这很有启发性,但对我没有用:输入链接说明
  12. 这也很有启发性,但对我没有用:输入链接说明

1
请检查您的index.yaml文件,并确保正确指定了索引等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接