GAE 数据存储游标是否永久且持久?

2024-04-16

这么说是否正确com.google.appengine.api.datastore.Cursor只是将索引位置存储到 GAE 数据存储索引中?

游标耐用吗?也就是说,我可以永久存储游标并一次又一次地重复使用它,并确定如果它指向索引中的第 5000 个位置,那就是它永远指向的位置吗?

如果索引缩减到少于 5000 个条目怎么办?使用此游标会导致错误或只是不返回任何内容吗?

对于较大的索引(例如 100,000 个或更多条目),我是否可以首先为每个 5000 个位置的倍数获取游标(例如),存储它们,然后使用这组游标以 Map/Reduce 方式执行某些工作?

我实际上使用的是 Objectify,而不是直接使用 DS,但据我所知,这不会影响游标相对于索引的属性。


游标仅在所进行的原始查询的上下文中才有意义。它们并不完全是索引位置/偏移量。从游标和数据更新 https://cloud.google.com/appengine/docs/java/datastore/query-cursors#cursors_and_data_updates:

光标的位置定义为结果列表中的位置 最后结果返回后。光标不是相对位置 列表(不是偏移量);它是 Cloud Datastore 的标记 开始索引扫描结果时可以跳转。如果结果为 查询在游标的使用之间发生变化,查询仅注意到变化 出现在光标之后的结果中。如果之前出现新的结果 查询时光标的位置,查询时不返回 获取游标后的结果。类似地,如果一个实体不是 查询结果较长但已出现在光标之前, 光标后出现的结果不会改变。如果最后的结果 返回已从结果集中删除,游标仍然知道如何 找到下一个结果。

也来自游标的限制 https://cloud.google.com/appengine/docs/java/datastore/query-cursors#limitations_of_cursors:

游标受到以下限制:

  • 游标只能由执行原始查询的同一应用程序使用,并且只能用于继续同一查询。使用光标 在后续的检索操作中,您必须重构 与原始查询完全相同,包括相同的实体种类、祖先 过滤器、属性过滤器和排序顺序。这是不可能的 使用游标检索结果,而无需设置相同的查询 它最初是生成的。
  • 由于 NOT_EQUAL 和 IN 运算符是通过多个查询实现的,因此使用它们的查询不支持游标,也不支持游标。 使用 CompositeFilterOperator.or 构造的复合查询 方法。
  • 对于使用不等式过滤器或对具有多个值的属性进行排序顺序的查询,游标并不总是按预期工作。 这种多值属性的重复数据删除逻辑并不 在检索之间持续存在,可能会导致相同的结果 回来过不止一次。
  • 新的 App Engine 版本可能会更改内部实现细节,从而使依赖于它们的游标失效。如果一个应用程序 尝试使用不再有效的游标,Cloud Datastore 引发 IllegalArgumentException(低级 API), JDOFatalUserException (JDO) 或 PersistenceException (JPA)。

如果您的数据没有改变,您可能可以以映射/归约方式使用游标(通过恢复原始查询),包括预先获取它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GAE 数据存储游标是否永久且持久? 的相关文章

随机推荐