【问题标题】:Why am I getting this exception in GAE为什么我在 GAE 中遇到此异常
【发布时间】:2011-03-18 17:38:58
【问题描述】:

我刚刚测试并将我的应用程序重新部署到一个测试实例,它工作正常,然后我更改了应用程序 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分钟了!需要多长时间!?

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

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

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

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

    【讨论】:

    • 索引是在SDK生成的索引定义文件上传到服务器时建立的。与 SDK 不同的是,生产环境在执行查询时不会自动构建索引。
    • 我通过将索引添加到 WEB-INF/datastore-indexes.xml 解决了这个问题,如下所述:dnhome.wordpress.com/2011/10/07/… GAE 建议它的条目,在我的情况下是正确的。
    【解决方案2】:

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

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

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

    所以本质上你可以在发布新版本时在版本 1 和 2 之间切换。

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

    【讨论】:

    • 我的行为完全相同:我有一个“测试版”版本,在该版本中我部署新的开发人员并构建所有需要的索引,然后再上传到“产品”。不过,我不需要“开关”,因为索引是共享的。
    【解决方案3】:

    发生这种情况是因为应用引擎数据存储索引未初始化,即 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 上打开数据索引视图。
    3. 确保您没有删除 datastore-indexes-auto-xml。 [我经常这样做]
    4. 存储每个“种类”的实体!
    5. 在查询中使用所有“种类”!
    6. 确保更新了 datastore-indexes-auto-xml [我有时甚至重新启动 eclipse]
    7. 部署到 appengine。
    8. 在浏览器上刷新数据索引视图。
    9. 等到看到索引
    10. 请告诉 Google 解决此问题。
    11. 这提供了丰富的信息,但对我不起作用:enter link description here
    12. 这也提供了丰富的信息,但对我不起作用:enter link description here

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-03
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多