簡體   English   中英

AppEngine如何計算交易的實體組?

[英]How does AppEngine count entity groups for a transaction?

如果我具有以下一組實體:

A --> (unowned) B
  \
   --> (owned) List<C>

D --> (owned) List<E> --> (owned) List<F> --> (unowned) A
  \
   --> (unowned) H

G --> (unowned) H
  \
   --> (unowned) D
  \
   --> (unowned) B
  \
   --> (unowned) A
  \
   --> (unowned) F
  \
   --> (unowned) F

如果我要在一個事務中接觸所有這些對象,則我將數4個實體組(A,B,D,H)。這應該被允許(根據文檔,最多可以有5個)。

因此,有兩個問題:1)獲取/創建它們是否重要? 即是

C c = new C(a);
a.getCs().add(c);

以某種方式使用兩個單獨的實體組,即使它具有父/子關系? 或者G具有兩個不同的F值的事實-是兩個實體組還是一個實體組?

2)當您訪問一個對象時,它有多深? 即如果我也有

D --> (owned) List<K> --> (owned) List<L> --> (unowned) M

即使我不訪問K,L或M,appengine也會在交易中訪問的實體組列表中包括M嗎?

從概念的角度來看,我對我的對象模型非常滿意(沒有appengine,我很確定我會以同樣的方式進行設計),但是我應該像其他人在這里建議的那樣做,並創建GenericObject一切的父母?

或者,或者,鑒於這在數據庫世界中是微不足道的,有六個月來有多少人放棄了DataStore for Cloud SQL? (也許最后一個對於stackoverflow太主觀,但這是一個真正的問題)

UPDATE

在仔細閱讀了將所有內容調試后生成的日志之后,我可以看到在某個時候我得到了以下行:

24634 [1419746043@qtp-647750325-2] DEBUG DataNucleus.Persistence - Performing reachability algorithm on object with id "com.google.appengine.api.datastore.Key:D("alex@hotmail.com")"

然后是從該根實體開始可以訪問的每個對象的大量檢索。 由於其中包括一堆未擁有的實體(也就是說,它們不使用父實體訪問過的任何實體),所以我猜這是導致我的交易失敗的原因,而第二季度的答案似乎是“到處'

所以... Q3-如何防止這種行為。 請注意,我要調用makePersistent(D)來保留已修改的F的兩個實例。

一些注意事項:

  1. 所有高級數據存儲區API(JDA / JPA / Objectify)都基於低級api構建。 他們不能做的比底層API的“更多”。 如果您想了解數據存儲,則應該了解底層API。

  2. 實體之間的關系基於一個實體,該實體具有另一實體的鍵的屬性。 簡而言之:實體包含另一個實體的ID。

  3. 您可以通過簡單地從實體中刪除關鍵屬性來破壞實體關系。 沒有像在SQL世界中那樣使用參照完整性:您可以在關系的任一側刪除實體而沒有任何約束。

  4. 實體組基於祖先關系,而對於上面第2點中提到的實體關系則無須做。祖先關系基於鍵:子鍵將包含所有父鍵的鍵。

  5. 由於祖先關系基於鍵,因此只能在創建實體時建立。 由於鍵是不可變的,因此以后無法更改。

  6. 實體組的寫入/更新限制為1個寫入/秒。 因此,將所有實體置於一個通用GenericObject下確實是一個壞主意。 您應該非常小心如何設計實體組,因為它們會影響性能。 良好的起點是將每個用戶實體作為實體組的根。

  7. 實體組旨在定義事務范圍(基本上,這意味着這些實體位於同一服務器上,因此具有寫限制),並且您不應使用它們在實體之間建立邏輯關系。

通過將以下內容添加到jdoconfig.xml中,我設法解決了該問題:

<property name="datanucleus.persistenceByReachabilityAtCommit" value="false"/>

http://www.datanucleus.org/products/datanucleus/performance_tuning.html中有記錄

如果有人想讓我評論一下為什么這是必要的,或者為什么我的對象模型是錯誤的,我非常感激,因為我是JDO和appengine的新手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM