Cloud Datastore の使用

Google Cloud Datastore を使用して、App Engine アプリからのアプリケーション データを保存できます。Cloud Datastore は、自動スケーリングと高いパフォーマンスを実現し、アプリケーション開発を簡素化するように構築されたデータベースです。

このドキュメントでは、Google Cloud クライアント ライブラリを使用し、App Engine アプリから Cloud Datastore にアクセスしてデータの保存と取得を行う方法を説明します。

前提条件と設定

App Engine の Java 用「Hello, World!」の説明に従って環境とプロジェクトを設定し、App Engine での Java アプリの構造を理解してください。このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID をメモして保存しておきます。

レポジトリのクローン作成

サンプルをダウンロード(クローニング)します。

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/datastore

プロジェクト設定の編集と依存関係の設定

pom.xml で、Cloud Datastore を使用可能にする依存関係を設定します。

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-datastore</artifactId>
  <version>1.34.0</version>
</dependency>

アプリケーション コード

このサンプル アプリケーションは訪問者の IP のログ記録、取得、および表示を行います。ログエントリはタイプ visit の単純な 2 フィールド クラスであり、datastore add() コマンドを使用して Cloud Datastore に保存されることがわかります。datastore run() コマンドを使用すると、最新の 10 件の訪問を降順に取得できます。

@SuppressWarnings("serial")
@WebServlet(name = "datastore", value = "")
public class DatastoreServlet extends HttpServlet {

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException,
      ServletException {
    // store only the first two octets of a users ip address
    String userIp = req.getRemoteAddr();
    InetAddress address = InetAddress.getByName(userIp);
    if (address instanceof Inet6Address) {
      // nest indexOf calls to find the second occurrence of a character in a string
      // an alternative is to use Apache Commons Lang: StringUtils.ordinalIndexOf()
      userIp = userIp.substring(0, userIp.indexOf(":", userIp.indexOf(":") + 1)) + ":*:*:*:*:*:*";
    } else if (address instanceof Inet4Address) {
      userIp = userIp.substring(0, userIp.indexOf(".", userIp.indexOf(".") + 1)) + ".*.*";
    }

    Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
    KeyFactory keyFactory = datastore.newKeyFactory().setKind("visit");
    IncompleteKey key = keyFactory.setKind("visit").newKey();

    // Record a visit to the datastore, storing the IP and timestamp.
    FullEntity<IncompleteKey> curVisit = FullEntity.newBuilder(key)
        .set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
    datastore.add(curVisit);

    // Retrieve the last 10 visits from the datastore, ordered by timestamp.
    Query<Entity> query = Query.newEntityQueryBuilder().setKind("visit")
        .setOrderBy(StructuredQuery.OrderBy.desc("timestamp")).setLimit(10).build();
    QueryResults<Entity> results = datastore.run(query);

    resp.setContentType("text/plain");
    PrintWriter out = resp.getWriter();
    out.print("Last 10 visits:\n");
    while (results.hasNext()) {
      Entity entity = results.next();
      out.format("Time: %s Addr: %s\n", entity.getTimestamp("timestamp"),
          entity.getString("user_ip"));
    }
  }
}

index.yaml ファイルの使用

このサンプルアプリは簡単なクエリを実行しています。より複雑な Datastore クエリには、1 つ以上のインデックスが必要になります。これらのインデックスは、アプリとともにアップロードする index.yaml ファイルで指定する必要があります。このファイルは手動で作成することも、アプリをローカルでテストするとき自動的に生成することもできます。

詳細情報

Cloud Datastore の最適化やコンセプトなどの詳細については、Cloud Datastore のドキュメントをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

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

Java の App Engine フレキシブル環境に関するドキュメント