跨组(XG)交易中的5个以上实体组

时间:2012-11-13 23:39:25

标签: java google-app-engine jdo datanucleus

背景:

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

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

这很有效。但是,我有很多无关的关系,所以有时我会更新超过5个实体组 - 例如我做一个批量标记操作,将整行的行标记为'done'。奇怪的是IT WORKS,尽管它在Google文档中明确表示XG事务仅限于5个实体组。我在这里错过了什么吗?

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

我有点困惑。这有可能在将来停止工作吗? JDO以某种方式管理交易的规模吗? XG交易是由最新的JDO自动管理,还是默认打开?

1 个答案:

答案 0 :(得分: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的父级,它是C的父级 - 因此只有2个实体组,即使与X的所有关系都标记为@Unowned。

顺便提一下,这也意味着你只需要坚持A.

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