gpt4 book ai didi

java - AppEngine 如何计算交易的实体组?

转载 作者:行者123 更新时间:2023-11-30 06:28:28 25 4
gpt4 key购买 nike

如果我有以下一组实体:

A --> (unowned) B
\
--> (owned) List<C>

D --> (owned) List<E> --> (owned) List<F> --> (unowned) A
\
--> (unowned) H

G --> (unowned) H
\
--> (unowned) D
\
--> (unowned) B
\
--> (unowned) A
\
--> (unowned) F
\
--> (unowned) F

如果我在一个事务中接触所有这些对象,我计算 4 个实体组(A、B、D、H)这应该是允许的(根据文档,您最多可以有 5 个)。

所以,有 2 个问题:1) 获取/创建它们的方式重要吗?即是

C c = new C(a);
a.getCs().add(c);

尽管是父/子关系,但还是以某种方式使用了两个单独的实体组?或者 G 有两个不同的 F 值这一事实——是两个实体组还是一个?

2) 当你访问一个对象时,它有多深?即如果我也有

D --> (owned) List<K> --> (owned) List<L> --> (unowned) M

即使我没有访问 K、L 或 M,appengine 是否将 M 包含在事务中访问的实体组列表中?

从概念的角度来看,我对我的对象模型相当满意(没有 appengine 我很确定我会再次以相同的方式设计它)但是我应该按照其他人在这里的建议去做并创建一个 GenericObject不知何故这是一切的父?

或者,鉴于这在数据库世界中相当微不足道,有多少人在 6 个月内放弃了 Cloud SQL 的 DataStore? (也许最后一个对于 stackoverflow 来说太主观了,但这是一个真正的问题)

更新

在浏览通过调试所有内容生成的日志后,我可以看到在某些时候我得到了以下行:

24634 [1419746043@qtp-647750325-2] DEBUG DataNucleus.Persistence - 对 ID 为“com.google.appengine.api.datastore.Key:D("alex@hotmail.com")”

然后是对每个对象的大量检索,这些对象可以从该根实体开始访问。由于这包括一堆无主的实体(也就是说,它们不使用任何作为其父级访问的实体)我想这就是导致我的交易失败的原因,而 Q2 的答案似乎是 '无处不在'

那么...Q3 - 我该如何防止这种行为。请注意,我调用 makePersistent(D) 是为了保留已修改的 F 的两个实例。

最佳答案

一些注意事项:

  1. 所有高级数据存储 API (JDA/JPA/Objectify) 都基于 low-level api 构建.它们不能比低级 API 做的“更多”。如果您想了解 Datastore,您应该了解低级 API。

  2. 实体之间的关系是基于一个实体拥有一个属性和另一个实体的键。简单地说:实体包含另一个实体的 ID。

  3. 您可以通过简单地从实体中删除键属性来破坏实体关系。没有像您在 SQL 世界中使用的那样的参照完整性:您可以在没有约束的情况下删除关系任一侧的实体。

  4. 实体组基于祖先关系,与上面第 2 点中提到的实体关系无关。祖先关系基于键:子键将包含所有父键的键。

  5. 由于祖先关系是基于键的,因此它只能在创建实体时建立。由于键是不可变的,因此以后无法更改。

  6. 实体组的写入/更新限制为每秒 1 次写入。因此,将所有实体置于一个通用的 GenericObject 下确实是一个坏主意。你真的应该小心你如何设计实体组,因为它们会影响性能。好的起点是将每个用户实体作为实体组的根。

  7. 实体组旨在定义事务范围(基本上这意味着这些实体驻留在同一台服务器上,因此存在写入限制),您不应该使用它们在实体之间建立逻辑关系。

关于java - AppEngine 如何计算交易的实体组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com