1

背景:

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

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

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

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

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

4

1 回答 1

3

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

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

于 2012-11-14T01:10:08.200 回答