Datastore-Indexe konfigurieren

Datastore nutzt beim Zugreifen aus App Engine für jede Abfrage, die von Ihrer Anwendung durchgeführt wird, Indexe. Diese Indexe werden bei jeder Änderung von Entitäten aktualisiert. Damit wird sichergestellt, dass die Ergebnisse schnell zurückgeliefert werden, wenn die Anwendung eine Abfrage startet. Hierzu muss für Datastore im Voraus angegeben werden, welche Abfragen die Anwendung ausführt. In einer Konfigurationsdatei legen Sie fest, welche Indexe Ihre Anwendung benötigt. Der Entwicklungsserver kann beim Testen Ihrer Anwendung die Indexkonfiguration für Datastore automatisch generieren.

Datastore-Indexe erstellen

Sie geben die Konfiguration für Datastore-Indexe in WEB-INF/datastore-indexes.xml, im Verzeichnis war/ Ihrer Anwendung an.

Wie auf der Seite Cloud Datastore-Indexe beschrieben, besteht ein Index aus einer Tabelle mit Werten für eine Reihe bestimmter Attribute von Entitäten eines bestimmten Typs. Jede Spalte mit Propertywerten ist entweder in aufsteigender oder absteigender Reihenfolge sortiert. Die Konfiguration für einen Index gibt die Entitätstypen sowie die Namen der Properties und deren Sortierfolge an.

Im Folgenden finden Sie ein Beispiel für datastore-indexes.xml, das zwei Indexe angibt:

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes
  autoGenerate="true">
    <datastore-index kind="Employee" ancestor="false">
        <property name="lastName" direction="asc" />
        <property name="hireDate" direction="desc" />
    </datastore-index>
    <datastore-index kind="Project" ancestor="false">
        <property name="dueDate" direction="asc" />
        <property name="cost" direction="desc" />
    </datastore-index>
</datastore-indexes>

Indexe mit dem Entwicklungsserver erstellen

Das manuelle Festlegen von Indexen für Abfragen Ihrer Anwendung kann lästig und fehleranfällig sein. Erfreulicherweise kann der Entwicklungsserver die Indexkonfiguration für Sie übernehmen. Zur Verwendung der automatischen Indexkonfiguration fügen Sie das Attribut autoGenerate="true" dem <datastore-indexes>-Element Ihrer WEB-INF/datastore-indexes.xml-Datei hinzu. Die automatische Indexkonfiguration wird auch dann verwendet, wenn Ihre Anwendung keine datastore-indexes.xml-Datei hat.

Wenn die automatische Indexkonfiguration aktiviert ist, unterhält der Entwicklungsserver eine Datei mit dem Namen WEB-INF/appengine-generated/datastore-indexes-auto.xml im war/-Verzeichnis Ihrer Anwendung. Wenn Ihre Anwendung auf dem Entwicklungsserver eine Datastore-Anfrage durchführt, für die kein entsprechender Index in datastore-indexes.xml oder datastore-indexes-auto.xml vorhanden ist, fügt der Server die entsprechende Konfiguration zu datastore-indexes-auto.xml hinzu.

Wenn die automatische Indexkonfiguration beim Hochladen Ihrer Anwendung aktiviert ist, verwendet AppCfg sowohl datastore-indexes.xml als auch datastore-indexes-auto.xml, um zu ermitteln, welche Indexe für Ihre Anwendung in der Produktion erstellt werden müssen.

Wenn autoGenerate="false" in datastore-indexes.xml, dem Entwicklungsserver und AppCfg vorhanden ist, ignorieren Sie den Inhalt von datastore-indexes-auto.xml. Wenn die lokal ausgeführte Anwendung eine Abfrage ausführt, deren Index nicht in datastore-indexes.xml angegeben ist, löst der Entwicklungsserver eine Ausnahme aus, genau wie beim Produktions-Datastore.

Es ist ratsam, die Indexkonfiguration gelegentlich von datastore-indexes-auto.xml nach datastore-indexes.xml zu verschieben, die automatische Indexkonfiguration zu deaktivieren und Ihre Anwendung auf dem Entwicklungsserver zu testen. So können Sie Ihre Indexe ganz einfach in nur einer Datei verwalten und dafür sorgen, dass bei Ihren Tests Fehler aufgrund von fehlenden Indexkonfigurationen reproduziert werden.

Indexe manuell erstellen

Sie können Ihrer datastore-indexes.xml-Datei manuell Indexe hinzufügen oder Indexe, die der Entwicklungsserver automatisch in der datastore-indexes-auto.xml-Datei erstellt hat, in Ihre datastore-indexes.xml-Datei verschieben.

Weitere Informationen finden Sie in der Referenz zu datastore-indexes.xml.

Indexe aktualisieren

Wenn Sie eine Anwendung mithilfe der Aktion update hochladen, enthält das Update die Indexkonfiguration der Anwendung (die Dateien datastore-indexes.xml und generated/datastore-indexes-auto.xml). Wenn mit der Indexkonfiguration ein Index definiert wird, der noch nicht vorhanden ist, wird der neue Index von App Engine erstellt. Je nachdem, wie viele Daten bereits in Datastore vorhanden sind und im neuen Index erwähnt werden müssen, kann der Prozess zur Erstellung des Index etwas dauern. Falls die Anwendung eine Abfrage ausführt, für die ein noch nicht fertiggestellter Index erforderlich ist, wird eine Ausnahme ausgelöst.

Achten Sie zur Vermeidung dieser Situation darauf, dass die neue Version der Anwendung, für die ein neuer Index erforderlich ist, erst nach Fertigstellung des Indexes aktiv wird. Sie können dies erreichen, indem Sie der Anwendung in appengine-web.xml jedes Mal eine neue Versionsnummer zuweisen, wenn Sie einen Index in der Konfiguration hinzufügen oder ändern. Die Anwendung wird dann als neue Version hochgeladen und wird nicht automatisch zur Standardversion. Wenn die Indexerstellung abgeschlossen ist, können Sie die Standardversion in der Cloud Console ändern.

Wenn Sie die Indexkonfiguration vor dem Hochladen der Anwendung separat hochladen, sorgen Sie dafür, dass neue Indexe erstellt werden, bevor die neue Anwendung live geschaltet wird. Wenn Sie nur die Indexkonfiguration für eine Anwendung hochladen möchten, verwenden Sie die Aktion update_indexes:

./appengine-java-sdk/bin/appcfg.sh update_indexes myapp/war

Die datastore-indexes.xml-Datei sollte sich im WEB-INF/-Verzeichnis des Standardmoduls befinden.

In der Cloud Console können Sie den Status der Indexe der Anwendung prüfen.

Nicht verwendete Indexe löschen

Wenn Sie einen Index in der Indexkonfiguration ändern oder daraus entfernen, wird der ursprüngliche Index nicht automatisch aus App Engine gelöscht. Dadurch haben Sie die Möglichkeit, weiterhin eine ältere Version der Anwendung auszuführen, während neue Indexe erstellt werden. Außerdem können Sie sofort zur älteren Version zurückkehren, wenn bei einer neueren Version ein Problem festgestellt wird.

Wenn Sie sicher sind, dass alte Indexe nicht mehr benötigt werden, können Sie sie mit der Aktion vacuum_indexes aus App Engine löschen:

./appengine-java-sdk/bin/appcfg.sh vacuum_indexes myapp/war

Mit diesem Befehl werden alle Indexe für die Anwendung gelöscht, die in den lokalen Versionen von datastore-indexes.xml und WEB-INF/appengine-generated/datastore-indexes-auto.xml nicht erwähnt werden.