【问题标题】:More than 5 entity groups in a Cross Group (XG) transaction跨组 (XG) 事务中超过 5 个实体组
【发布时间】:2012-11-13 23:39:24
【问题描述】:

背景:

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

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

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

我还应该提到,我没有明确地为 JDO 启用 XG 事务 - 再次,它似乎工作。日志表明它实际上是在进行交易。

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

【问题讨论】:

标签: java google-app-engine jdo datanucleus


【解决方案1】:

我不确定这是否是一个答案,但我可以告诉你,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。

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

由于你没有分享你的对象模型的任何细节,我不能说这是否和你所拥有的一样......

【讨论】:

  • 感谢您提供有用的信息。我有两种用户和锻炼。每个用户都有许多锻炼,这些锻炼是无主的。这是在 JDO 1.0 中实现的,所以不是@unowned,我只是使用 Key 对象自己管理它。每个实体都是一个根实体。
  • 那么我同意,如果您的锻炼密钥没有用户密钥作为父项,它们应该位于单独的实体组中,并且当您尝试在事务中修改超过 5 个时会失败。也许考虑将 User 键设置为 Workout 的父级,如果您担心 Workout 实体的数量太大,可以阅读以下内容:stackoverflow.com/questions/3342603/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多