データストア インデックスの設定

App Engine からアクセスする Google Cloud Datastore は、アプリケーションからのすべてのクエリにインデックスを使用します。インデックスはエンティティが変更されるたびに更新されるので、アプリからのクエリに対してすばやく結果を返すことができます。これを実現するには、アプリからどのようなクエリが要求されるかを、Cloud Datastore 側であらかじめ把握しておく必要があります。アプリケーションで必要になるインデックスを設定ファイルで指定しておきます。開発用サーバーでは、アプリケーションをテストする際に、Cloud Datastore のインデックス設定を自動的に生成できます。

Cloud Datastore インデックスの作成

Cloud Datastore のインデックスの設定は、アプリケーションの war/ ディレクトリ内の WEB-INF/datastore-indexes.xml に指定します。

データストアのインデックスのページで説明したように、インデックスとは、特定の種類のエンティティの特定のプロパティ セットの値の表です。プロパティ値の各列は、昇順または降順に並べ替えられます。インデックスの設定では、エンティティの種類、プロパティの名前とそれらの並べ替え順を指定します。

次に、2 つのインデックスを指定する datastore-indexes.xml の例を示します。

<?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>

開発用サーバーを使用してインデックスを作成する

アプリケーションのクエリで必要になるインデックスを手作業で設定すると、面倒なだけでなく間違えやすくなります。幸いなことに、開発用サーバーでは、インデックスを自動的に設定することができます。インデックスを自動設定するには、属性 autoGenerate="true"WEB-INF/datastore-indexes.xml ファイルの <datastore-indexes> 要素に追加します。インデックスの自動設定は、アプリケーションに datastore-indexes.xml ファイルがない場合でも使用できます。

開発用サーバーでインデックスの自動設定を有効にすると、アプリケーションの war/ ディレクトリに WEB-INF/appengine-generated/datastore-indexes-auto.xml というファイルが作成されます。開発用サーバーで実行しているアプリケーションで、対応するインデックスが datastore-indexes.xml にも datastore-indexes-auto.xml にもない Cloud Datastore クエリを試みると、サーバーが datastore-indexes-auto.xml に適切な設定を追加します。

アプリケーションのアップロード時に自動インデックス設定が有効になっている場合、AppCfg は datastore-indexes.xmldatastore-indexes-auto.xml の両方を使用して、本番環境のアプリのために作成する必要があるインデックスを特定します。

datastore-indexes.xmlautoGenerate="false" と指定している場合、開発用サーバーと AppCfgdatastore-indexes-auto.xml の内容を無視します。この場合、ローカルで実行されているアプリケーションが、datastore-indexes.xml にインデックスが指定されていないクエリを実行しようとすると、本番用の Cloud Datastore と同様に、開発用サーバーから例外がスローされます。

インデックス設定を時には datastore-indexes-auto.xml から datastore-indexes.xml に移動し、インデックスの自動設定を無効にして、アプリケーションを開発用サーバーでテストすることをおすすめします。これにより、2 つのファイルを管理しなくてもインデックスを簡単に管理でき、さらにインデックスが設定されていない場合のエラーをテストで確実に再現できます。

インデックスを手動で作成する

datastore-indexes.xml ファイルに手動でインデックスを追加することも、または開発用サーバーが datastore-indexes-auto.xml ファイルに自動的に作成したインデックスを datastore-indexes.xml ファイルに移動することもできます。

構文については、datastore-indexes.xml リファレンスを参照してください。

インデックスの更新

update アクションを使用してアプリケーションをアップロードすると、アップデートにはアプリケーションのインデックス設定(datastore-indexes.xml および generated/datastore-indexes-auto.xml ファイル)が含まれます。インデックス設定でまだ存在しないインデックスを定義している場合、App Engine が新しいインデックスを作成します。新しいインデックスのデータが Cloud Datastore にどの程度存在するかによって、インデックスの作成に時間がかかることがあります。まだ作成が完了していないインデックスを要求するクエリをアプリが実行すると、例外が発生します。

このエラーを回避するため、インデックスの作成が完了するまで、新しいインデックスを必要とするアプリの新しいバージョンをライブ バージョンにしないでください。設定でインデックスを追加または変更するときに、appengine-web.xml でアプリに新しいバージョン番号を設定します。アプリは新しいバージョンとしてアップロードされますが、自動的にデフォルト バージョンにはなりません。インデックスの作成が完了したら、Cloud Platform Console でデフォルト バージョンを変更します。

また、アプリをアップロードする前にインデックス設定を先にアップロードしても、新しいアプリをライブ バージョンにする前に新しいインデックスを作成できます。アプリのインデックス設定のみをアップロードするには、update_indexes アクションを使用します。

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

datastore-indexes.xml ファイルはデフォルトのモジュールの WEB-INF/ ディレクトリに配置する必要があります。

Cloud Platform Console で、アプリのインデックスの状況を確認できます。

使用されていないインデックスの削除

インデックス設定でインデックスを変更または削除する場合は、元のインデックスは App Engine から自動的に削除されません。これにより、新しいインデックスを作成しながらアプリの古いバージョンを実行したり、新しいバージョンで問題が発見されたらすぐに古いバージョンを復元したりすることができます。

古いインデックスが不要であると確信できる場合には、vacuum_indexes アクションを使用して App Engine から削除できます。

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

このコマンドは、datastore-indexes.xml および WEB-INF/appengine-generated/datastore-indexes-auto.xml のローカル バージョンに含まれていないアプリのすべてのインデックスを削除します。

外出先でもリソースをモニタリング

Google Cloud Console アプリを入手して、プロジェクトの管理にお役立てください。

フィードバックを送信...

Java の App Engine スタンダード環境