ここでは、サンプルプログラムを通してWindows Azure4jの使い方を見ていきます。
アカウントの設定とテーブル作成は、次のように記述します。
// アカウント設定 StorageAccountInfo account = new StorageAccountInfo( URI.create("table.core.windows.net"), false, "test234", // account name "h7CH1BiwQuwGejOK7EbxFhheSRLF6CXdUekazgiE23MAwb3B/4QfxPe77DhpuFUL7IAubtN+oFsc6f2G/bo1vg==" // primary access key ); TableStorage ts = TableStorage.create(account);// TableStorageへ接続 CloudTable table = ts.getWindowsAzureTable("testtable");// AzureTableへ接続 //テーブルが存在しない場合、作成 if(!table.doesTableExist()){ table.createTable(); }
ここでは、Azure Storage作成時のアカウント名をtest234に、アクセスキーが「h7CH1...1vg==」の例です。ストレージ上に'testtable'という名前のテーブルを作成します。
アカウント名とアクセスキーは、Windows Azureポータルの各リソースの詳細画面から確認できます。図8の例で示すと、エンドポイントのURLのホスト名とPrimary Access Keyを指定します。
Azure Tableは、Entity Attribute Value形式でデータを格納しますが、WindowsAzure4jを利用すると、格納するエンティティの型を定義できます。
エンティティの型定義を行うことにより、テーブル内のデータモデルの一貫性を保てます。ユーザー情報として名前、年齢、住所、電話番号を持つエンティティの例をリスト1に示します。
リスト1 エンティティの定義(UserEntity.java)
エンティティは、TableStorageEntityクラスを継承して作成します。コンストラクタでは、下記のようにパーティションキーとRowキーを指定します。
public UserEntity(String partitionKey, String rowKey){ super(partitionKey, rowKey); }
Azure Tableでは、各データは「パーティション」と呼ばれる領域に分割して保存されます。1パーティションのデータは1サーバ内に格納されるので、頻繁にアクセスされるデータ同士は1パーティション内に格納しておくといいでしょう。
Rowキーは、パーティション内で一意に識別されるIDを指定します。パーティションキーとRowキーは、2つの組み合わせで一意のデータとして識別されます。異なるパーティションでは、Rowキーが同じでも別のデータとして扱われます。
後は、settter/getterを付与したプロパティ定義すれば、データモデルになります。
定義したエンティティは、下記のように記述してテーブルにモデルとして設定します。
// エンティティクラスをセット table.setModelClass(UserEntity.class);
エンティティのインサート例を示すと、次のようになります。
//バッチ処理の開始 table.startBatch(); for(int i=0;i<10;i++){ UserEntity e = new UserEntity("パーティション1","hoge"+i); e.setName("ユーザ"+i); e.setEmail("hoge"+i+"@example.com"); e.setAge(i%20+20); e.setTel("03-3456-000"+i); e.setAddress("東京都中央区ほげ"+i); table.insertEntity(e); } // バッチ処理の実行 table.executeBatch();
TableのinsertEntityメソッドでデータを挿入します。上記のstartBatch()とexecuteBatch()は必ずしも必要ではありませんが、複数のデータ処理を行う場合は付けておいた方がいいでしょう。
Azure Tableでは、デフォルトでは1データアクセスごとにAzure Tableへデータを書き込みにいきますが、バッチを利用すれば複数のSQLをまとめて実行でき、高速に実行できます。環境にも左右されると思いますが、筆者の環境では約30倍の差が出ました。
テーブル内のデータを取得するには、次のようにQueryクラスを利用して行います。
List<TableStorageEntity> list = table.retrieveEntities(Query.select().lt("age", "30").top(3));
JPAやHibernateのクライテリアのように、オブジェクトの組み合わせで検索条件を指定します。検索条件の詳細は、「QueryクラスのAPI」をお読みください。
上記のAPIの中で、where句が使えそうですが、WindowsAzure4jのwhere句は、SQLのwhere句と異なり、Azure Tableのフィルタ処理のための検索条件を指定します。
例えば、ageが30以上のエンティティの検索は、次のようになります。
List<TableStorageEntity> list = table.retrieveEntities(Query.select().lt("age", "30").top(3));
where句の検索条件の詳細は、「Windows AzureデータストレージTableサービス」をご覧ください。
検索で取得したオブジェクトの内容を変更して、テーブルへ反映させるには、テーブルクラスのupdateEntityメソッドを使います。
table.updateEntity(e);
エンティティをテーブルから削除するには、CloudTableクラスのdeleteEntityメソッドを使います。
table.deleteEntity(e);
アップデートと削除も、インサートと同じくバッチを利用して実行すると、実行が速くなります。
WindowsAzure4jのデフォルトのログの設定では、デバッグモードで詳細なログを出力するようになっていて、ちょっとうざいです。次のように記述したlog4j.propertiesをおいて、ログを減らしておくといいでしょう。
log4j.rootLogger=info, stdout log4j.addivity.org.apache = true log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
本稿では、Windows Azure4jを利用して、Windows AzureのAzure TableをJavaから操作する方法を紹介しました。本稿で紹介したコードのサンプルは、こちらからダウンロード(azuretest.zip)できるので、確認してみてください。
ほかにも、Hosted Serviceと「Windows Azure Tomcat Solution Accelerator」を利用すると、Windows AzureのHosted Service上でTomcatを動作できようになり、Webアプリケーションをクラウド上で公開できるようになります。興味がある人はぜひチャレンジしてみてはいかがでしょうか。
編集部より:Windows Azureを含むクラウドコンピューティングに興味を持った読者は下記インデックスページをご確認ください。随時更新中で、クラウド・コンピューティングの最新情報も分かります。
Copyright © ITmedia, Inc. All Rights Reserved.