japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2008年10月7日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー2006年6月20日 10:00

Java DBをクライアントサイドのポータブルなデータベースにする

海外海外internet.com発の記事
  • このエントリーを含むはてなブックマーク
  • この記事をクリップ!
  • Buzzurlにブックマーク
  • Yahoo!ブックマークに登録
  • newsing it!

はじめに

 Javaアプリケーション用の排他的な組み込みデータベースというアイデアは非常に素晴らしいものですが、その潜在的な力を完全に活用できるようになるにはまだ時間がかかりそうです。現在では、デスクトップアプリケーションやブラウザアプリケーションの補助的なクライアントサイドのデータベースとして、あるいはネットワークデータベースに何か問題が起きた場合のバックアップデータベースとして、このアイデアが使われています。

 ネットワークデータベースは、さまざまなアプリケーションのビジネスデータを格納する永続的なリポジトリとして使われていますが、どのアプリケーションにも、ユーザーの画面設定など、ビジネスには関係のない多くのデータが入っています。このようなビジネスに関係のないデータをネットワークデータベースに格納することは、貴重なネットワーク資源とデータベース資源の無駄遣いです。この種のデータはアプリケーションの実行中のみ使用可能にすべきであり、これを実現するパーフェクトなソリューションがJava DBです。

 Java DBは、100パーセントJavaベースの軽量RDBMSで、標準のJava仮想マシンを使って実行できます。Java DBは軽量ですが、リレーショナルデータベースシステムのACID(Atomic, Consistent, Isolation, Durable:原子性、一貫性、独立性、耐久性)特性を満たしています。従って、コミット済みのデータを失ったり、破壊の危険にさらされることなく、クラッシュ前のデータを復元することができます。Java DBは、SQLやJDBCなど、すべてのリレーショナルデータベース標準をサポートしています。その結果、プラットフォームに依存せず、標準に準拠しているあらゆるデータベースと相互運用性があります。

 Java DBにはさまざまな機能がありますが、なかでも開発者の関心を引くのは、XMLファイルを使ってXMLスキーマをその場で作成し、SQLを使わずにテーブルに行を挿入できる機能です。従来はJavaからDMLステートメントを処理するときにはSQLを使っていましたが、Java DBではSQLを使わずに同じ処理を実行できます。本稿では、Swingを使って組み込みデータベース内のユーザー設定を保管および取得するアプリケーションサンプルを交えて、これらの機能を詳しく解説します。

DdlUtilsコンポーネント

 Javaパーサーは、複雑に入り組んだXML文書の構文解析とナビゲーションを行うためのプログラムです。本稿で取り上げるDdlUtilsコンポーネントは、それと同じ概念に基づいて、データベーステーブル内でのデータナビゲーションと操作をJavaコードからダイレクトに行うことができます。DdlUtilsを使うと、データベーススキーマ全体をXML形式でその場で作成することができます。さらにDdlUtilsは、XMLまたはJavaオブジェクトに対する既存のスキーマのリバースエンジニアリングもサポートしています。これにより、トランザクション管理や同時性やバックアップなどのデータベース管理機能をJava DBに担当させ、このデータベースとのやり取りをDdlUtilsで処理するというアーキテクチャが可能になります。

XMLスキーマをその場で作成する

 Java DBには、アプリケーションが起動したときにデータベースを作成し、データファイルのディレクトリを削除するだけでデータベースを削除できる機能があります。このアプローチにより、データベースはもはや独立したエンティティではなく、コードの一部になるため、排他的に制御することができます。本稿では、分かりやすいようにゴルフ場検索アプリケーションを作成しながらJava DBのこれらの機能を解説します。サンプルアプリケーションを起動すると、組み込みのJavaデータベースも一緒に起動します。アプリケーションを終了すると、データベースも一緒に終了します。このサンプルアプリケーションはデスクトップアプリケーションですが、標準のJavaなので、プラットフォームに依存せずに実行できます(例えば、モバイルアプリケーションとしても十分に活用できます)。

 まず、本稿のサンプルファイルをダウンロードします。ここには、「derby.jar」(Java DB)と「DdlUtils.jar」が入っています。その他のコードはJakarta Commonsから入手したもので、コードのコンパイルに役立ちます。

 次に、http://db.apache.org/torque/dtd/database.dtdで公開されているスキーマの規則に従って、データベーススキーマのXMLファイルを作成します。DdlUtilsを使ってDatabaseモデルのJavaオブジェクトにこのXMLを読み込んで構文解析します。

 次のコードは、XMLで作成したゴルフ場検索アプリケーションのデータベーススキーマです。

<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database.dtd">
<database name="testdb">
  <table name="userData">
      <column name="userName"
              type="VARCHAR"
              primaryKey="true"
              size="20"
              required="true"/>
      <column name="password"
              type="VARCHAR"
              size="20"
              required="true"/>
  </table>

 次のコードによって、上記のXMLからDatabaseモデルのJavaオブジェクトが作成されます。

// filename represents the database schema in XML format
public Database readDatabaseFromXML(String fileName)
{
    return new DatabaseIO().read(fileName);
}

 最後に、Platformクラスを使ってデータベーステーブルを作成します。

// derby is synonym for Java DB
Platform platform = PlatformFactory.createNewPlatformInstance("derby");
platform.createTables(conn, database, true, true);

SQLを使わずにテーブルにデータを挿入する

 DdlUtilsは、DynaBeanクラスに基づいてテーブル内のデータを変更します。一般的なbeanには固定のプロパティと、それらのプロパティに対するsetterメソッドとgetterメソッドがあります。DynaBeanでは、その名の通り、beanのプロパティを動的に作成することができます。DynaBeanは、値だけでなく、名前とデータ型も動的に変更可能なプロパティをサポートするJavaオブジェクトです。今回のサンプルでは、基になるテーブルの列の名前と列の値をプロパティとします。

 次のコードでは、テーブル内のデータを表すJavaオブジェクトが作成され、Platformクラスを使ってそのデータがテーブルに挿入されます。

//insert data into table without SQL insert statement
DynaBean userData = database.createDynaBeanFor("userData", false);
userData.set("userName",     "tiger");
userData.set("password",     "singh");
platform.insert(conn, database, userData);

 このコードテクニックにより、java.sql.Statementjava.sql.ResultSetを作成する煩雑さがなくなります。さらに重要なことに、カーソルがクローズしているかどうかを確認する必要がなくなります(これ以外の方法を使う場合は、最大オープンカーソル数の超過によるアプリケーションの異常終了を防ぐために、すべてのカーソルがクローズしているかどうかを確認する必要があります)。

PlatformクラスとDatabaseクラス

 「derby.jar」の中でも特に重要なのがPlatformクラスとDatabaseクラスです。

 Platformインターフェイスは、クエリや操作などDMLステートメントを処理するためのデータベース関連の機能を提供します。また、特定のプラットフォームに固有のSQLビルダも入っています。DdlUtilsには、データベースプラットフォームごとに個別の実装クラスが用意されています。例えば、サンプルアプリケーションで使用したプラットフォームは「Derby」です。

 DatabaseクラスはDatabaseモデル(つまりデータベース内のテーブル)を表します。また、テーブルに格納されているオブジェクトのDynaBeansを作成するための対応する動的クラスも入っています。Tableクラスは、その名の通り、データベーステーブルのJavaオブジェクトを表します。DDLステートメントはすべて、DatabaseクラスとTableクラスを使って処理することができます。

アプリケーションを実行する

 DdlUtilsはまだ開発中であり、本稿の執筆時点ではバイナリ版がリリースされていないので、リポジトリからコードを取得してビルドを実行するか(方法2)、サンプルファイル内の「extjars」フォルダにあるjarsを使用してください(方法1)。

 次に、この2つの方法の手順を紹介します。

 方法1:

  1. サンプルファイルをCドライブまたはDドライブにインストールします。
  2. 「cp.bat_txt」を「cp.bat」という名前に変更します。
  3. 「cp.bat」を編集し、インストールディレクトリを書き換えます。
  4. コマンドプロンプトウィンドウを開き、「cp.bat」を実行します。
  5. 「<インストールディレクトリ>demo」ディレクトリに移動します。
  6. コンパイルを実行します。$> javac MySimpleApp.java
  7. アプリケーションを実行します。$> java MySimpleApp DBSchema.xml

 方法2:

  1. developers.sun.comからJava DBをダウンロードします。
  2. http://db.apache.orgからDdlUtilsをダウンロードします。
  3. 現時点ではDdlUtilsのバイナリディストリビューションはないので、jakarta.apache.org/commonsから次のすべてのJakarta Commonsパッケージをダウンロードする必要があります。
    • commons-beanutils.jar
    • commons-betwixt-0.7.jar
    • commons-collections-3.1.jar
    • commons-digester-1.7.jar
    • commons-lang-2.1.jar
    • commons-logging.jar
  4. すべてのパッケージをクラスパスに指定し、サンプルファイル内の「MySimpleApp.java」をコンパイルして実行します。

 アプリケーションが起動すると、データベースのインスタンスが作成されます。そして、XMLファイルからデータベーススキーマが読み取られてスキーマが作成されます。2人のユーザーに関連するデータはDynaBeansを使って挿入されます。アプリケーションには、ユーザーからユーザー名とパスワードを集めるためのユーザーインターフェイスがあり、組み込みデータベースに格納されているパスワードとの照合が行われます(図1を参照)。

図1 tiger/singhまたはvijay/woodsを使ってログインする初期画面
図1 tiger/singhまたはvijay/woodsを使ってログインする初期画面

 ログインに成功すると、次の画面では、左側に利用可能な有名なゴルフ場、右側にユーザーがプレイしたことのあるゴルフ場の一覧が表示されます(図2を参照)。

図2 右側のリストに含まれているゴルフ場はJava DBから取得したもの
図2 右側のリストに含まれているゴルフ場はJava DBから取得したもの

 アプリケーションは、図2の画面を呼び出している間に、ユーザーがプレイしたゴルフ場の一覧をデータベースから読み取ります。データベースは組み込みモードで使われているので、アプリケーションが終了されると終了します。

可能性を考える

 組み込みのJavaデータベースで何が実現できるかは、ソフトウェアアーキテクトと開発者の想像力次第です。数年後には、Java DBを使ったダウンタイムのないインタラクティブなアプリケーションをたくさん目にすることになるでしょう。現時点では、Java DBを、Microsoft OfficeやOpenOfficeのオフィス文書用のリポジトリとして使用したり、新しいタイプのさまざまなのAJAXアプリケーションで使用したりする計画が進行中です。さらに重要なことに、Java DBは、モバイルアプリケーションのさまざまな機能的問題(データレプリケーションなど)の解決策にもなります。

著者紹介

Raghu Donepudi(Raghu Donepudi)
Global Computer Enterprisesの主任システム開発者。テキサス州のラマー大学にてコンピュータ工学の修士号を取得。Sun認定Java開発者であり、ソフトウェア設計テクニックについての著作多数。
最新トップニュース
Graphic Design Forum
【Graphic Design Forum】
コメントをお寄せいただいた方々へ (10月7日)
データメーション
【データメーション】
eBayのやり口(10月7日)
ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」
【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
「プロの営業マンを社会に輩出していく!!」/株式会社A・R・M(10月6日)
エンジニアの独り言
【エンジニアの独り言】
得体の知れない情報(?)との向き合い方(9月17日)
最新テクノロジーの意外な処方箋
【最新テクノロジーの意外な処方箋】
昆虫と退屈なことについて(9月16日)
「IT の耳」
「IT の耳」
【書評】ニコ動から RMT まで〜『人はなぜ形のないものを買うのか―仮想世界のビジネスモデル』(10月7日)
DevX
DevX
アジャイルソフトウェアプロジェクトを管理する(10月7日)
エンジニア転職ノウハウ開発室
エンジニア転職ノウハウ開発室
SEって、デジタル製品は判官びいきで選ぶよね?(10月7日)
アイレップの SEM フロンティア
アイレップの SEM フロンティア
フル CSS でサイト構築をする SEO のメリット(10月7日)
百式のネットビジネス研究
百式のネットビジネス研究
YouTube の動画に吹き出しで台詞を入れられる「TubePopper」(10月7日)
モバイルSEO@フラクタリスト
モバイルSEO@フラクタリスト
応用的な SEO 施策(3)(10月6日)
サーチからはじまるインタラクティブエージェンシー
サーチからはじまるインタラクティブエージェンシー
DB マーケティングと Web マーケティング 〜ビールとオムツの伝説から〜(10月6日)
最新ハイテク講座
最新ハイテク講座
視聴者が参加する時代へ!ネットにつながる「テレビ」(10月3日)
developer.com
developer.com
デザインパターンの使い方: Command(10月3日)
最新アフィリエイト事例にみる成功の法則
最新アフィリエイト事例にみる成功の法則
アフィリエイトメディアとの付き合い方(10月3日)
海外のインターネットコムアメリカ韓国ドイツトルコ
Copyright 2008 Jupitermedia Corporation All Rights Reserved.http://www.internet.com/