SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine for Javaを使ってみよう!

Google App Engine for Javaを使ってみよう!
(5)Datastore Java API

Google App Engine for Javaを使ってみよう! (5)

Datastore Java APIを使ってみよう!

 Google App EngineのデータストアにアクセスするためのJava標準APIは「Java Data Objects(JDO)」「Java Persistence API(JPA)」の2種類があります。Google Plugin for Eclipseでは、プロジェクト作成時にJDOの設定ファイルが自動生成されるので、今回の記事では、JDOの使い方を説明したいと思います。

 まずは、永続化対象となるデータクラスのソースコードを見てみましょう。

@PersistenceCapable(identityType = IdentityType.APPLICATION)  // (1)
public class StoreData {

    @PrimaryKey  // (2)
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  // (3)
    private Long id;
    @Persistent  // (4)
    private String name;
    @Persistent  // (4)
    private Integer data;

    public StoreData(String name, Integer data) {
        this.name = name;
        this.data = data;
    }
}
  1. データの一意性を保障してほしい範囲を指定します。この場合、アプリケーションの全バージョンを通して一意であることが保障されます。
  2. メンバー変数idをプライマリーキーに設定します。
  3. キーの自動設定方法を指定します。
  4. メンバー変数name, dataが永続化対象であることを指定します。
@PersistenceCapable

 データの一意性を保障する範囲を設定する@PersistenceCapableのidentityTypeには、APPLICATION、DATASTORE、UNSPECIFIEDの3項目が指定できますが、筆者が試した範囲では3つともスコープが同じように見えましたので、通常はAPPLICATIONを指定しておけば良いでしょう。

@Persistent

 データをストアしたときに、自動的に振られるキーは1,2,3,4……とインクリメントされていますが、突然1001,1002,1003……などの大きな数字に飛ぶことがあります。これは、データストアが複数のサーバ上で稼動しており、保存されたデータのキーの一意性を簡単に保障するための工夫だと考えられます。

 

 おそらく、「サーバAには0」「サーバBには1000」「サーバCには2000」と初期値が設定されており、データを保存するように指示されたサーバは自分のサーバの初期値から始まる数値からインクリメントしており、キーを1000個使い切ると次の1000個を予約するのだと考えられます。

 

 IdGeneratorStrategy.IDENTITY以外の設定も試してみましたが、すべてGoogle App Engine上でエラーになりました。保存データに連番を振りたい場合、プログラムで努力するしかないようです。

 次にデータクラスを永続化するソースコードを見てみましょう。

PersistenceManagerFactory pmfInstance = JDOHelper
.getPersistenceManagerFactory("transactions-optional");  // (1)

StoreData storeData = new StoreData("蕎麦", "10");  // (2)
PersistenceManager pm = pmfInstance.getPersistenceManager();  // (3)
try {
    pm.makePersistent(storeData);  // (4)
} finally {
    pm.close();  // (5)
}
  1. src/META-INF/jdoconfig.xmlに記述してある、transactions-optionalの設定をロードします。
  2. 先ほどのデータクラスに永続化したいデータを設定します。 
  3. 設定(1)のPersistenceManagerを取得します。
  4. 永続化します。
  5. PersistenceManagerを閉じます。 

 最後に、データストアからデータを取得する部分のソースコードを見てみましょう。

PersistenceManager pm = PMF.get().getPersistenceManager();  // (1)
String query = "select from " + StoreData.class.getName();  // (2)
List<StoreData> list = (List<StoreData>) pm.newQuery(query).execute();  // (3)
  1. PersistenceManagerを取得します。
  2. StoreDataデータクラスの一覧を取得する、SQLライクな文法でクエリーを定義します。
  3. (2)のクエリーを実行し、List<StoreData>を取得します。

次のページ
データストアにデータを保存する

この記事は参考になりましたか?

Google App Engine for Javaを使ってみよう!連載記事一覧

もっと読む

この記事の著者

山下 大介(ヤマシタ ダイスケ)

  京都大学を中心とした、産官学共同プロジェクトのSOBAプロジェクトに参加後、同プロジェクトで開発したP2P配信によるVoIP技術を2005年に商業化。オープンソース、VoIP、P2P、クラウドコンピューティングに精通。趣味はGoogleの追っかけ。現在は、株式会社SOBAプロジェクト取締役。ブログ:『~ ミネルヴァの梟は黄昏とともに飛び始める ~』所属:株式会社SOBAプロジェクトGoogle Developer Day 2008サポーター, 2009サポーターGoogle App Engine API Expert

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3904 2009/05/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー