背景:
我最近在 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/