Java DBをクライアントサイドのポータブルなデータベースにするはじめに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); } 最後に、 // derby is synonym for Java DB Platform platform = PlatformFactory.createNewPlatformInstance("derby"); platform.createTables(conn, database, true, true); SQLを使わずにテーブルにデータを挿入する DdlUtilsは、 次のコードでは、テーブル内のデータを表すJavaオブジェクトが作成され、 //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); このコードテクニックにより、 PlatformクラスとDatabaseクラス 「derby.jar」の中でも特に重要なのが アプリケーションを実行するDdlUtilsはまだ開発中であり、本稿の執筆時点ではバイナリ版がリリースされていないので、リポジトリからコードを取得してビルドを実行するか(方法2)、サンプルファイル内の「extjars」フォルダにあるjarsを使用してください(方法1)。 次に、この2つの方法の手順を紹介します。 方法1:
方法2:
アプリケーションが起動すると、データベースのインスタンスが作成されます。そして、XMLファイルからデータベーススキーマが読み取られてスキーマが作成されます。2人のユーザーに関連するデータはDynaBeansを使って挿入されます。アプリケーションには、ユーザーからユーザー名とパスワードを集めるためのユーザーインターフェイスがあり、組み込みデータベースに格納されているパスワードとの照合が行われます(図1を参照)。 図1 tiger/singhまたはvijay/woodsを使ってログインする初期画面 ![]() ログインに成功すると、次の画面では、左側に利用可能な有名なゴルフ場、右側にユーザーがプレイしたことのあるゴルフ場の一覧が表示されます(図2を参照)。 図2 右側のリストに含まれているゴルフ場はJava DBから取得したもの ![]() アプリケーションは、図2の画面を呼び出している間に、ユーザーがプレイしたゴルフ場の一覧をデータベースから読み取ります。データベースは組み込みモードで使われているので、アプリケーションが終了されると終了します。 可能性を考える組み込みのJavaデータベースで何が実現できるかは、ソフトウェアアーキテクトと開発者の想像力次第です。数年後には、Java DBを使ったダウンタイムのないインタラクティブなアプリケーションをたくさん目にすることになるでしょう。現時点では、Java DBを、Microsoft OfficeやOpenOfficeのオフィス文書用のリポジトリとして使用したり、新しいタイプのさまざまなのAJAXアプリケーションで使用したりする計画が進行中です。さらに重要なことに、Java DBは、モバイルアプリケーションのさまざまな機能的問題(データレプリケーションなど)の解決策にもなります。 著者紹介Raghu Donepudi(Raghu Donepudi)
Global Computer Enterprisesの主任システム開発者。テキサス州のラマー大学にてコンピュータ工学の修士号を取得。Sun認定Java開発者であり、ソフトウェア設計テクニックについての著作多数。
|