为什么我在GAE中遇到此异常

时间:2010-07-20 23:28:11

标签: java google-app-engine jdo

我刚刚测试并将我的应用程序重新部署到测试实例,它工作正常,然后我更改了应用程序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 个答案:

答案 0 :(得分:10)

当您创建新查询并在本地计算机上首次使用它们时,它们始终是第一次工作。当您第一次在谷歌应用引擎上运行这些新查询时,他们将返回此异常,因为谷歌应用引擎服务器需要一些时间来生成“索引”以允许您的查询正常工作。

我建议您在创建新查询时,在生产环境中为它们提供一次性运行以构建“索引”,这样当用户点击它们时,它们就会第一次运行。

其次,在您需要之前手动预先定义查询并将其上传到服务器,意味着当您真正需要它们时,它们可能已经在服务器上构建。

答案 1 :(得分:5)

我解决此问题的方法是为我的应用维护许多版本。 通常是这样的:

  • 版本1 :当前默认
  • 版本2 :下一个版本

当我准备好部署新版本时,我会在此实例中将其上传到版本2 。构建索引后,我将版本2 设置为默认值。这样客户就不会遇到任何停机或错误。

因此,在发布新版本时,您可以在版本1和版本2之间进行交换。

我建议您在上传到已部署的“应用程序”之前,在不同的测试“应用程序”中进行预测试。

答案 2 :(得分:2)

这是因为app-engine数据存储索引未初始化,即corydoras的答案是正确的。我正在添加我的java修复[我假设python和index.yaml有类似的修复]。

您可以在https://appengine.google.com/上查看您使用自己的Google帐户投放的索引。单击左侧和左侧菜单上的应用程序链接,选择数据

下的数据存储索引

当对数据存储区进行新查询时,可能需要数小时才能更新数据索引。

首先,您应该知道,每次存储新的“Kind”实体时,本地环境中的调试都会创建一个名为datastore-indexes-auto-xml的文件。

在本地环境中,它可以立即用于查询,但更新数据存储索引-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. 这提供了丰富的信息,但对我不起作用:enter link description here
  12. 这也是提供信息,但对我不起作用:enter link description here

答案 3 :(得分:1)

检查index.yaml文件并确保在那里指定了正确的索引等。