2016-06-16 12 views
1

Innerhalb einer Transaktion muss ich mehrere Entitäten (Zehntel-Hunderter) laden und diese Entitäten wurden einer übergeordneten Entität zugewiesen, so dass sie als eine Entitätsgruppe betrachtet werden (andernfalls wir kann nicht diejenigen Entitäten in einer einzigen Transaktion) laden, die aber gut funktioniert müssen jedes Mal, wenn wir diese Einheiten die MuttergesellschaftDataStore mit Objectify - Laden von Entitäten/Schlüsseln ohne Angabe des übergeordneten Elements

ofy().load().type(clazz).parent(parent).ids(keys);

Wenn wir die Einheiten ohne die übergeordnete Entität abfragen zu ladende geladen wird geladen wird, dann erwartet dies zu arbeiten und laden Sie die Einheiten, aber es ist nicht

ofy().load().type(clazz).ids(keys);

Der Grund dahinter, wenn zwei oder mehrere Threads gleichen/verschiedenen Einträge zu laden, rufen Sie (aber gleichen Eltern) es zu viel Belastung auf die übergeordnete Entität "java.util.ConcurrentModificationException verursachen würde: zu viel Streit auf diese Datenspeichereinheiten. . Bitte versuchen Sie es erneut“

Bitte Rat

Antwort

0

Der Grund für die Ihr ofy().load().type(clazz).ids(keys) nicht zur Arbeit erscheinen, ist, dass Sie nicht den übergeordneten Schlüssel angeben - die für die Schlüssel der Wurzel der Suche entspricht Einheiten (dh Einheiten ohne einen Elternteil), die offensichtlich ein anderes Ergebnis liefert.

die übergeordneten Schlüssel (eigentlich die gesamte Abstammung) in einem Kind Entitätsschlüssel embeeded ist, siehe Ancestor paths.

Also haben Sie müssen geben Sie die Eltern - die "Last" auf der übergeordneten (tatsächlich auf der gesamten Entität Gruppe, vor allem bei Schreibvorgängen) ist der Preis für die Vorteile der Arbeit innerhalb der gleichen Gruppe zu zahlen.

+0

Das bedeutet Laden von X Entity ** keys ** Ertrag zum Laden von X parent ** entity **, was bedeutet, dass Sie innerhalb einer Transaktion einfach keine 1K ** Schlüssel laden können ** was völlig sinnlos ist, und ich bin mir nicht sicher, dass es richtig ist. – sami

+0

Das Laden einer Entität oder ihres Schlüssels bedeutet nicht, dass die übergeordnete Entität oder ihr Schlüssel ebenfalls geladen wird (die Eltern sind möglicherweise nicht einmal vorhanden, siehe http://stackoverflow.com/a/37283449/4495081). –

+0

Der Konflikt wird durch den Zugriff auf dieselbe Entitätsgruppe und nicht durch die Anzahl der Gruppenentitäten/Schlüssel selbst verursacht. –

0

Die Ursache dieser Frage ist ein grundlegendes Missverständnis darüber, wie Transaktionen und Entitätsgruppen im Datenspeicher funktionieren.

Die offizielle Dokumentation ist recht zugänglich:

https://cloud.google.com/appengine/docs/java/datastore/transactions#Java_Entity_groups

Ich schrieb dies vor einiger Zeit auf, kann es einfacher sein, zu verstehen: dass diese isn

https://github.com/objectify/objectify/wiki/Concepts

Beachten über das Laden der übergeordneten Entität. Es geht darum, Entity-Gruppen in einer Transaktion einzutragen. Wenn Sie eine Entität in diesem EG (dh eine Entität mit einem gemeinsamen übergeordneten Schlüssel) berühren, haben Sie die gesamte EG in die Transaktion eingetragen.

+0

Also, die Frage ist wieder, wenn wir X-Entity laden, dann wird der Eltern X-mal geladen, und davon ausgehen, gibt es nur noch einen Thread, der auf verschiedene Entitäten aber selbe Eltern zugreifen, dann verursachen zu viele Zugriffe auf die gleiche Entität - Eltern (Ausnahme auftreten), wie man besser damit umgehen? – sami

+0

Sie müssen Ihre Anforderungen für starke Konsistenz einerseits und Transaktionsdurchsatz andererseits sorgfältig abwägen. Die richtige Antwort ist fast immer ohne starke Konsistenz zu leben, setzen Sie Ihre Entitäten in separate Entity-Gruppen, aber es hängt wirklich von Ihrer Anwendung ab. – stickfigure

+0

Von [https://github.com/objectify/objectify/wiki/Concepts#entity-groups](https://github.com/objectify/objectify/wiki/Concepts#entity-groups) "In der Tat, Sie kann untergeordnete Entitäten mit einem übergeordneten Schlüssel (oder einem anderen Schlüssel als Mitgliedsfeld) erstellen, der auf eine nicht vorhandene Entität verweist! Übergeordnetes Element ist nur wichtig, da es Entitätsgruppen definiert. Wenn Sie keine Transaktionen über mehrere Entitäten benötigen, möchten Sie möglicherweise Verwenden Sie eine normale nichtparable Schlüsselbeziehung - auch wenn die Entitäten eine konzeptionelle Eltern-Kind-Beziehung haben. " Würde das in meinem Fall helfen? – sami