[英]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的兩個實例。
一些注意事項:
所有高級數據存儲區API(JDA / JPA / Objectify)都基於低級api構建。 他們不能做的比底層API的“更多”。 如果您想了解數據存儲,則應該了解底層API。
實體之間的關系基於一個實體,該實體具有另一實體的鍵的屬性。 簡而言之:實體包含另一個實體的ID。
您可以通過簡單地從實體中刪除關鍵屬性來破壞實體關系。 沒有像在SQL世界中那樣使用參照完整性:您可以在關系的任一側刪除實體而沒有任何約束。
實體組基於祖先關系,而對於上面第2點中提到的實體關系則無須做。祖先關系基於鍵:子鍵將包含所有父鍵的鍵。
由於祖先關系基於鍵,因此只能在創建實體時建立。 由於鍵是不可變的,因此以后無法更改。
實體組的寫入/更新限制為1個寫入/秒。 因此,將所有實體置於一個通用GenericObject下確實是一個壞主意。 您應該非常小心如何設計實體組,因為它們會影響性能。 良好的起點是將每個用戶實體作為實體組的根。
實體組旨在定義事務范圍(基本上,這意味着這些實體位於同一服務器上,因此具有寫限制),並且您不應使用它們在實體之間建立邏輯關系。
通過將以下內容添加到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.