java - Cross Group (XG) 交易中超过 5 个实体组

标签 java google-app-engine jdo datanucleus

背景:

我最近在 GAE SDK 1.7.3 中更新到 JDO 2.0/Datanucleus 3.1.1。我有二级缓存到 memcache,我发现当我对子实体执行某些操作时,我在缓存中看到过时的数据。例如,当我从一个集合中删除一些子项时,片刻之后又添加新的,然后它更新数据存储,但不更新缓存,因此后续读取将发回陈旧数据。

无论如何,这是一个单独的问题——我的解决方法是将更新放入事务中,这样缓存条目就会失效并被删除(事务不会将更改写入内存缓存)。

这行得通。但是,我有很多无主关系,所以有时我会更新 5 个以上的实体组 - 例如,我执行批量标记操作,将整个加载的行标记为“完成”。奇怪的是 IT WORKS,尽管它在 Google 文档中明确表示 XG 交易仅限于 5 个实体组。我在这里遗漏了什么吗?

我还应该提到,我没有为 JDO 显式启用 XG 事务 - 同样,它似乎可以工作。日志表明它实际上是在进行交易。

我只是有点困惑。这可能会在未来停止工作吗? JDO 是否以某种方式管理事务的大小? XG 事务是由最新的 JDO 自动管理的,还是默认打开的?

最佳答案

我不确定这是否是一个答案,但我可以告诉您,5 个实体组的限制肯定是强制执行的(或者至少从 SDK 1.7.1 开始是这样),因为我已经与它抗争了很多次。

首先,您确定您的 jdoconfig.xml 中没有以下内容:

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>

我的模型中也有许多无主关系,我绕过实体组限制的解决方案是将多个对象放在同一个实体组中。基本上我有一些类似的东西:

X -- has a -- A
  \- has a -- B
  \- has a -- C

但 A 也是 B 的父级,B 是 C 的父级 - 因此只有 2 个实体组,即使与 X 的所有关系都标记为@Unowned。

顺便说一句,这也意味着你只需要坚持A。

因为你没有分享你的对象模型的任何细节,我不能说这是否与你拥有的一样......

关于java - Cross Group (XG) 交易中超过 5 个实体组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370783/

相关文章:

Java EE 登录页面问题

JavaFX TableView - 无法编辑

python - 从数据存储查询返回列表时, fetch() 是否比 list(Model.all().run()) 更好?

google-app-engine - 何时选择 App Engine 而不是 Cloud Functions?

mysql - Datanucleus JDO + MySQL 创建长文本列

Java-填充重叠的多边形

google-app-engine - Google Cloud Datastore Go Client默认不会关闭连接吗?

java - Data Nucleus 带有注释的多对多属性关系

java - 如何使用 Apache ISI 中的 jdo 查询从表行号在 20 到 30 之间获取记录

Java 2d 坐标变换