1

バックグラウンド:

最近、GAE SDK 1.7.3 で JDO 2.0 / Datanucleus 3.1.1 に更新しました。memcache への第 2 レベルのキャッシュがあり、子エンティティに対して特定の操作を行うと、キャッシュに古いデータが表示されることがわかりました。たとえば、セットからいくつかの子を削除し、しばらくしてから新しい子を追加すると、データストアは更新されますが、キャッシュは更新されないため、後続の読み取りは古いデータを送り返します。

とにかく、それは別の問題です-私の回避策は、キャッシュエントリが無効化されて削除されるように、更新をトランザクションに入れることでした(トランザクションはmemcacheに変更を書き込みません)。

これは機能します。ただし、所有されていない関係がかなりあるため、5 つを超えるエンティティ グループを更新することがあります。たとえば、行のロード全体に「完了」のフラグを立てる一括フラグ操作を行います。奇妙なことは、XG トランザクションが 5 つのエンティティ グループに制限されていることを Google のドキュメントで明示的に述べているにもかかわらず、IT WORKS です。ここで何か不足していますか?

また、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はCの親であるBの親でもあります。したがって、Xとのすべての関係が@Unownedとマークされていても、2つのエンティティグループのみです。

ちなみに、それはあなたがAを持続するだけでよいことも意味します。

オブジェクトモデルの詳細を共有していないので、これがあなたが持っているもののようなものであるかどうかはわかりません...

于 2012-11-14T01:10:08.200 に答える