アットマーク・アイティ @IT@IT情報マネジメント@IT自分戦略研究所QA@ITイベントカレンダー  
 
 @IT > Java開発からO/Rマッピングを取り除くCachéが“POJO”を取り込んでさらに進化した!
 
@IT Special

 

PR

Java開発からO/Rマッピングを取り除く
Cachéが“POJO”を取り込んでさらに進化した!

 〜新技術「Jalapeñoテクノロジ」の実力とメリットをさぐる〜

O/Rマッピング不要でオブジェクトを永続化できるデータベースとして、Java開発者から支持されているCaché。2006年11月に正式リリースされた「Jalapeño(ハラペーニョ)テクノロジ」によって、CachéはJava開発者にとって一層便利なデータベースに生まれ変わった。POJOサポートによって何が変わったのか、具体的に見ていこう。

オブジェクト指向/Java開発者の
長年の悩みはO/Rマッピング

 Java開発者の大きな悩みの1つに、オブジェクトの永続化におけるインピーダンスミスマッチがある。これはオブジェクト指向の開発言語であるJavaによって定義された永続クラスを、リレーショナル・データベース(以下、RDB)に格納したり復元する際に生じる、データモデルの不整合のことだ。

 この問題は、近年オブジェクト指向開発が広く普及するにつれてクローズアップされてきた。Javaに代表されるオブジェクト指向の開発言語が主流となっている現在、RDBが不動の地位を維持していることは難しくなりつつある。とはいえ現実には、データベースの主流はいまだにRDBという状況があるのも、まぎれもない事実だ。

 この溝を埋めるため、Java開発者はオブジェクトとRDB双方のデータをマッピングする作業を余儀なくされている。このO/Rマッピングは困ったことに、開発者にとっては単調で退屈きわまりない作業であり、同時にプロジェクトマネジメントの観点からは、開発生産性の足を引っ張る大きな要因となってきた。O/Rマッピングの工数は、ときに全コーディング量の60〜70%にも上るといわれるほど。いかに開発の現場の重い負担になっているかが想像できよう。

 HibernateといったO/Rマッピング用のツールも登場しているが、完全に自動化できるわけではなく、またRDBを対象としている限りデータ構造の変更が生じるとすべて作り直しとなるなど、インピーダンスミスマッチの解消にはわずかな効果しか期待できない。

インピーダンスミスマッチを解消できる
ポスト・リレーショナルデータベース「Caché」とは?

 こうしたオブジェクトとRDBの不整合は、マッピングという「異種を異種」に変換するステップがある限り消えることがない。であれば、究極の解決策として、この変換をすることなく、オブジェクトをそのままデータベースに格納/取り出しできる仕組みを考えればよい。そうした発想の基に誕生したのがオブジェクト指向データベース(以下、OODB)である。

 OODB製品の中でもインターシステムズの提供する「Caché(キャシエ)」は、単なるOODBの領域を超えた幅広い機能を持つ「多次元データベース」であり、SQLが使用でき、かつ、従来のRDBの限界を超えたデータハンドリングを可能にすることから「ポスト・リレーショナルデータベース」とも呼ばれている。

 Cachéの大きな特長の1つに、パフォーマンスの大幅な向上が挙げられる。データを2次元の表で表現しなければならない従来のRDBと異なり、Cachéでは多次元配列にデータを格納する仕組みになっている。“スパース配列”と呼ばれるこの多次元配列では、データはすべて“まばらな”多次元配列に格納されている(下記の@IT記事に詳細な解説がある)。このため複雑な親子関係にあるオブジェクト型のデータを、いちいち2次元の表形式に変換する必要がなく、ありのままのオブジェクトとしてデータベースに収めることが可能だ。オブジェクトを単純にシリアライズしてストレージに格納する従来型のOODBと違って、スパース配列に効率よくデータを格納するので、従来のOODBより高いパフォーマンスを発揮する。

 CachéにJavaからアクセスする場合、これまではCaché内で永続クラスを定義し、そこからJavaプロキシ(代理=Cachéクラスを投影させたJavaのクラス定義)を自動作成する。このプロキシをJavaのプログラムから利用してCachéにデータを格納することによって、Javaのプログラム空間とOODBとしてのCachéデータストレージ空間を透過的に融合できるアーキテクチャになっていた。

 だがO/Rマッピングを霧消させたCachéにも、開発者から見た場合に気になる点はあった。Javaからデータベースにアクセスするには、ある程度Caché独自の開発手法を習得する必要があったのだ。O/Rマッピングほどの手間はかからないが、Cachéで永続クラスをコーディングする必要はあった。

Javaのプログラム空間だけでJavaクラスに永続性を与える
画期的なJalapeñoテクノロジ

 もっと手軽にCachéを利用したいというJava開発者の声に応えて、2006年11月に正式リリースされたのが、CachéにおけるPOJOサポート「Jalapeño(ハラペーニョ)テクノロジ」である。この新しいテクノロジについて、インターシステムズジャパン株式会社 テクニカルコンサルティング&教育サービス部 部長の佐藤比呂志氏に伺ってみよう。

 
  インターシステムズジャパン株式会社 テクニカルコンサルティング&教育サービス部 部長
佐藤比呂志氏

 「POJOというのは、最近のJavaに関する話題では必ずといっていいほど出てくるキーワードです。これは“Plain Old Java Object”の頭文字を取ったものですが、なぜあえてこうした素朴なプログラミング手法への回帰が叫ばれているのかというと、その背景には今日のEJB(Enterprise JavaBeans)に代表されるJ2EEが複雑化し過ぎていて、あまり使いこなせていないという事実があります。それをもっと単純にして、開発現場で使えるようにしましょうというのがPOJOの発想なのです」。

 では、POJOの思想を採り入れたJalapeñoテクノロジとは、いったいどういうものだろうか。一言でいうと、「CachéセントリックからJavaセントリックへの進化」(佐藤氏)だという。

 上でも説明したように、これまでJavaからCachéへアクセスする際には、まずCaché側でクラス定義を作成して、そこからJavaのプロキシクラスを生成して、という2段階を踏んでいた。つまり、あくまでCachéありきの構造になっていた=Cachéセントリックだったのである(図1)。

 図1 従来のJavaのプロキシクラスを通したCachéへの接続

 「Cachéの定義を作成するには、開発者がCachéの専用開発ツール(IDE)を使って手作りする必要がありました。そこからJavaプロキシの生成はツールで自動化されているのですが、その手前に当たるステップだけは手作業だったのです」(佐藤氏)。これを行うために、ある程度はCachéの独自の開発手順を習得しなくてはならなかった。

 「Jalapeñoのアプローチは、従前のCachéありき、つまりCachéの開発環境がないとコーディングできない不便さを解消する試みなのです」と佐藤氏は語る。JavaセントリックなJalapeñoでは、開発者はあくまでもJavaの世界にとどまったままでCachéを利用できるようになった(図2)。

 図2 JalapeñoテクノロジによるCachéへの接続

 では、実際にどのような方法を取るのか、具体例を紹介しよう。

JalapeñoによるCachéの利用法

 まずJalapeñoを利用して、POJO定義からCachéクラスを作成し、コンパイルする方法を紹介しよう。開発者は通常のJavaコードの中で、永続化したいクラスに対してアノテーション(注釈)を加える(リスト1)。

import com.intersys.pojo.annotations.CacheClass;
import com.intersys.pojo.annotations.Index;

@CacheClass(name="Person",primaryKey="ID",sqlTableName="PERSON")
@Index(description="Name Index on Person table",name="PersonIndexOne",
propertyNames={"name"},sqlName="PersonIDX")
public class Person {
   public String name;
   public String ssn;
   public String telephone;
}
リスト1 アノテーションを付加したPOJOのクラス定義
「@」で始まる2行がCachéオブジェクトモデルについてのメタデータだ。Javaのクラス定義にたったこれだけの注釈を加えるだけで、Cachéを利用できるようになる。

 アノテーションはJDK 5.0で採用された機能で、プログラムの動作には影響を与えずにメタデータを付加するもの。Jalapeñoテクノロジは、アノテーションを利用してCachéオブジェクトモデルについてのメタデータを付加する。Cachéは注釈付きのJavaクラス定義に基づいて、永続性のあるCachéクラスを生成、コンパイルする機能(スキーマ・ビルダ)を持っており、リスト1をコンパイルするとリスト2のCachéクラスが生成される。

Class User.Person Extends %Library.Persistent [ ClientName = Person, 
Not ProcedureBlock,SqlTableName = PERSON ]
{
Property name As %Library.String(JAVATYPE = 
 "java.lang.String", MAXLEN = 4096);

Property ssn As %Library.String(JAVATYPE = 
 "java.lang.String", MAXLEN = 4096);

Property telephone As %Library.String(JAVATYPE = 
 "java.lang.String", MAXLEN = 4096);
 Index PersonIndexOne On name [ SqlName = PersonIDX ];

XData JavaBlock
{
<JavaBlock><Package implementation="CacheRefactor.cache" 
pojo="CacheRefactor">
</Package><UseSameNames>false</UseSameNames>
<Name implementation="Person" pojo="Person"></Name>
<ResolveNameCollisions>false</ResolveNameCollisions>
<EagerFetchRequired>true</EagerFetchRequired></JavaBlock>
}
リスト2 自動生成されたCachéクラス
Java開発者は基本的に、このCaché独自クラスを意識することなくJavaアプリケーションからCachéデータベースを利用できる。

 次に、Cachéに格納された永続オブジェクトに接続する場面を紹介する。従来のJavaプロキシクラスの利用とは異なり、Jalapeñoテクノロジではオブジェクトマネージャを使用してデータベースに接続し、Cachéクラスのインスタンスを作成して検索・更新といった処理を行う(リスト3)。

//オブジェクトマネージャの生成
Class.forName ("com.intersys.jdbc.CacheDriver");
Connection connection = 
   DriverManager.getConnection (url, username, password);
objectManager = ApplicationContext.createObjectManager (connection);

//POJO オブジェクトの操作(新規作成)
Customer john = new Customer();
john.name = "John Smith";
john.ssn = "222-22-2222";

//POJO インスタンスの永続化
objectManager.save(john);

//POJO 既存オブジェクトの取得
Customer customer1 = customerBySSN ("111-11-1111");

public Customer customerBySSN (String ssn) throws Exception {
  String query = "ssn = ?";
  return customerByQuery (query, ssn);
}

private Customer customerByQuery (String query, String arg)
        throws Exception {
  Iterator it = objectManager.openByQuery (Customer.class, query,
                                           new Object[]{arg});
  if (it.hasNext ())
    return (Customer) it.next ();
  throw new Exception ("Customer not found.");
}
リスト3 オブジェクトマネージャを使用したデータベースアクセス
オブジェクトマネージャのインスタンス生成は、通常のJDBCコーディングと変わらない。後はオブジェクトの格納、抽出をオブジェクトマネージャに依頼すればよい。

 さて、Jalapeñoの具体像を理解できただろうか。Jalapeñoテクノロジの登場によって、Javaによるアプリケーション開発がいっそう簡素化されたことは、Java開発者にとって大きな福音といえる。

 「これまで存在したO/Rマッピングツールは、例えばHibernateにしても、生成した後でもXML定義ファイルをメンテナンスするという手間がありました。O/Rマッピングツールによる自動化である程度の工数は稼げますが、結局はどこかで追加の手間がかかっていたのです。それがJalapeñoではJavaの世界から透過的にCachéデータベースにアクセスできるようになり、開発者はJavaのことだけに集中していればよくなったのです」(佐藤氏)。

 深い階層構造を持つデータでは、既存のRDBに対するCachéの優位性はさらに際立ってくると佐藤氏はいう。「RDBは複雑な階層構造のクラスを複数の表にマッピングするので、オブジェクトを参照するときには複数の表を結合しないといけない、つまり複数のディスクI/Oが発生するわけです。しかしCachéの多次元モデルの中では親、子、孫という関係をひとかたまりのデータとして持てるので、I/O負荷の見地からも圧倒的に有利です。また、Cachéでは階層構造に変更があってもデータベースの設計変更は最小で済みます」。

 もともとO/Rマッピング不要で、しかもデータ構造の変更に強いというアドバンテージに、今回の「Jalapeñoテクノロジ=完全なマッピングの自動化」が加わって、ますますOODBの中でCachéを選択するメリットは高まったといってよいだろう。


提供:インターシステムズジャパン株式会社
企画:アイティメディア 営業局
制作:@IT編集局
掲載内容有効期限:2006年12月16日
 
関連リンク
Cachéポスト・リレーショナルデータベース

Cachéテクノロジガイド

Cachéオンライン・プレゼンテーション

Caché評価版ダウンロード

Caché無料紹介セミナー

インターシステムズジャパン

導入事例
IBMのある1部門がCachéのPOJOで開発時間を劇的に短縮

「オブジェクトとリレーショナル間のマッピングには数カ月以上を要しますが、Cachéでオブジェクトに永続性を与える作業はわずか15分で済みます」

- Software Systems Architect
Iran Hutchinson氏-


株式会社ユヤマ
−急進する電子カルテシステムの秘密を探る


株式会社NTTデータ
− さまざまなフォーマットに対応し高速処理でWeb健診システムを支える

         
株式会社パルタック
−ストアーソリューションまでを考えて構築された統合小売り管理


慶応義塾大学メディアセンター
−大学図書館システムに柔軟なデータ管理と高度なパフォーマンスを実現


 
@ITトップ@IT Special インデックス会議室利用規約プライバシーポリシーサイトマップ