mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
リレーショナルデータベース(以下、RDB)からXML DBへデータを移行するためのスキーマ設計がそれほど難しくないことは、「これなら簡単 RDBからXML DBへのデータ移行」で紹介した。XMLであるからといって、無理に込み入った階層構造を作る必要はなく、RDBの正規化された一連のテーブル群をJOINして、例えば、Microsoft Excelでも容易に扱えるフラットな構造にしてやればよい。そのうえで、必要ならば意味的にカテゴライズが必要な情報群から徐々に階層構造を構築すればよいのだ。しかし、階層構造を作るのは、あくまで二義的な作業であって、データを移行するうえでの必須の要件ではない。
ここでは「これなら簡単 RDBからXML DBへのデータ移行」で作成したAccessファイル(「.mdb」ファイル)をJavaアプリケーションから動的にXML文書に変換し、それをXprioriに格納する実作業の流れを紹介しよう。Xprioriは無償で利用可能なネイティブXMLデータベース(NXDB)だ。無償とはいえ、商用製品であるNeoCoreXMSとほぼ同様の機能を提供しており、導入も容易なので、まずはNXDBがどのようなものか、その感触を体験してみるには最適の選択肢となるはずだ。
本記事で紹介するアプリケーションを操作するために必要なソフトウェアは、以下のとおりである。
2004年11月時点でのJ2SEの最新バージョンは5.0であるが、XprioriはJ2SE5.0では動作しないので注意してほしい。本稿では、バージョン1.4系の最新バージョン1.4.2_05を採用することとする。J2SEのインストールに関する詳細は割愛し、以下では、Xprioriのインストール方法についてのみ概略を紹介しよう。
Xprioriは以下のサイトからダウンロード可能だ。ここでは、Windows対応版のインストーラであるxpriori-X.X.XX-win32.exe(X.X.XXはバージョン番号)をダウンロードする。
Xprioriのダウンロード・サイト
[1]インストーラを開始する
インストール自体は、ダウンロードした「xpriori-X.X.XX-win32.exe」をダブルクリックするだけでよい。インストール・ウィザードが起動するので、表1の例に従って必要な情報を入力していく。コンソールのユーザー名/パスワードは、後述する管理コンソールにログインする際に使用するものだ。
項目 | 設定値(例) |
---|---|
インストール先 | C:\Xpriori |
コンソールのユーザー名 | admin |
コンソールのパスワード | admin |
デフォルトのアクセスコントロールを有効にする | チェックする |
管理者のユーザー名 | Administrator(変更不可) |
管理者のパスワード | admin |
インストールの途中で、Xprioriを利用するためのアクティベーションを行う必要がある。アクティベーションを行うと、指定したメールアドレスにライセンス・ファイルが送付されてくる。使用に先立っては、このライセンス・ファイルを上記のインストール先であれば「C:\Xpriori\neoxml\config」にコピーしておく。
以上でXprioriのインストールは完了だ。通常は、デフォルトでXprioriサーバが起動するが、手動でサーバの起動/終了を行いたい場合には、スタートメニューから[すべてのプログラム]-[Xpriori]-[Start NeoServer]/[Stop NeoServer]で行うこともできる。
[2]Xprioriの動作を確認する
スタートメニューから[すべてのプログラム]-[Xpriori]-[Launch XMS Console]を選択する。認証ダイアログが表示されるので、ここではインストール時に設定したコンソールのユーザー名/パスワードを入力すればよい。以下のような画面が表示されればXprioriは正常に動作している。
図1 NeoCoreXMS Consoleのトップ画面
XMS Consoleは、Xprioriの管理画面であり、Xprioriの動作に関する基本的な設定やデータの登録/参照などを行うことができる。基本的な処理を行うだけであれば、特に初期設定などは必要ないので、ここではまずこのようなツールがあるのだという点だけを覚えておこう。
Xprioriが正常に動作していることが確認できたところで、いよいよAccess上のテーブルをXpriori上に移行してみる。サンプルのAccessファイル(顧客.mdb)は、以下からダウンロードすることができる。
Accessファイル(顧客.mdb)のダウンロード
Access上のテーブルは図2のとおり、3つのテーブルから構成されている。
図2 移行元のAccessデータ構成
[注意]
JavaアプリケーションからAccessデータベースにアクセスするためには、ダウンロードした「.mdb」ファイルをあらかじめODBCデータソースに登録しておく必要がある。ODBCへの登録は、スタートメニューから[管理ツール]-[データソース(ODBC)]から行うことができる。ここでは、データソース名を「xmldb」とする。
ここでは、顧客.mdbの3つのテーブルをJOINして、その結果をXML文書に変換し、Xprioriに格納する。以下のようなJavaアプリケーションを用意する。今回はXML文書の構造を単純にしているため、JavaのDOMインターフェイスは使用していない。
package to.msn.wings.samples; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import com.neocore.httpclient.SessionManagedNeoConnection; public class Rdb2Xmldb { public static void main(String[] args) { Connection db=null; PreparedStatement objPs=null; ResultSet rs=null; StringBuffer objSb=new StringBuffer(); try { // Accessデータベースからデータを取得 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); db=DriverManager.getConnection("jdbc:odbc:xmldb","",""); objPs=db.prepareStatement ("SELECT 顧客表.姓, 顧客表.名, 顧客表.年齢,業種表.業種名, 職種表.職種名 FROM 職種表 INNER JOIN (業種表 INNER JOIN 顧客表 ON 業種表.業種ID = 顧客表.業種ID) ON 職種表.職種ID = 顧客表.職種ID"); rs=objPs.executeQuery(); // 別稿の「コード3(customer03.xml)」相当のXML文書を生成 ResultSetMetaData rsmd=rs.getMetaData(); objSb.append("<?xml version='1.0' encoding='UTF-8' ?>"); objSb.append("<顧客データ>"); while(rs.next()){ objSb.append("<顧客>"); for(int i=1;i<=rsmd.getColumnCount();i++){ objSb.append("<" + rsmd.getColumnName(i) + ">"); objSb.append(rs.getString(i)); objSb.append("</" + rsmd.getColumnName(i) + ">"); } objSb.append("</顧客>"); } objSb.append("</顧客データ>"); // Xprioriへのセッションを確立 SessionManagedNeoConnection session =new SessionManagedNeoConnection("localhost",7700); // ログイン処理 String id=session.login("Administrator","admin"); // 生成したXML文書(文字列)をXprioriに登録 String result=session.storeXML(objSb.toString(), null, null); // ログアウト処理 session.logout(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(rs!=null){rs.close();} if(objPs!=null){objPs.close();} if(db!=null){db.close();} } catch (SQLException se) { se.printStackTrace(); } } } }
以上のコードを実行するには、コマンドプロンプトから以下のように入力すればよい。特にエラーメッセージなどが表示されなければ成功だ。
> SET CLASSPATH=".;C:\Xpriori\API\Java\lib\xmsclient.jar;" > javac ./to/msn/wings/samples/Rdb2Xmldb.java > java to.msn.wings.samples.Rdb2Xmldb
コード自体は長いように思われるかもしれないが、実はその大部分がリレーショナルデータベースの内容をXML文字列に変換している処理にすぎない。Xprioriにかかわる部分は太字の部分にすぎず、以下の手順に示す極めて定型的なものだ。
なお、ログイン時に使用するユーザー名/パスワードは管理コンソール用とは異なるので注意してほしい。
次に、上のコードで登録した内容を管理コンソールから確認してみよう。管理コンソールにログインし、[Database Access]タブを選択する。ログインIDとパスワードを聞かれるので、ここではデータベース管理者のIDとパスワードを入力する。
データベースの内容を参照するには、メニューから[Query]を選択し、XQuery Targetとして、以下の式を指定すればよい。
/ND/顧客データ
「ND」はXprioriサーバ全体のルートだと思っておけばよいだろう。格納されたXMLデータのすべてはこのNDノードの子ノードとして格納される。今回格納したXML文書のドキュメントルートは<顧客データ>なので、Xprioriから全文を参照するにはXpath式として「/ND/顧客データ」を指定する。このクエリの結果、以下のようなXMLデータが表示されれば成功だ。
図3 XMS Consoleからクエリを発行し、データを表示させた
同様に「/ND/顧客データ/顧客/顧客ID」などのクエリを試してみれば、XML DBがどのように動作するものなのか、実感としてつかめるだろう。
先ほどの例では、RDBから動的に生成したXML文字列をXprioriに格納したが、XMLデータがあらかじめファイルとして用意されているならば、これをそのまま投入することも可能だ。以下のJavaアプリケーションを見てみよう。
package to.msn.wings.samples; import com.neocore.httpclient.SessionManagedNeoConnection; public class XmlStore { public static void main(String[] args){ try { SessionManagedNeoConnection session= new SessionManagedNeoConnection("localhost",7700); String id=session.login("Administrator","admin"); String result=session.storeFileXML("c:\\sample.xml", null, null); session.logout(); } catch (Exception e) { e.printStackTrace(); } } }
先ほどのstoreXMLメソッドが、storeFileXMLメソッドに代わっただけである。以上のコードを実行するには、コマンドプロンプトから以下のコマンドを入力すればよい。
> SET CLASSPATH=".;C:\Xpriori\API\Java\lib\xmsclient.jar;" > javac ./to/msn/wings/samples/XmlStore.java > java to.msn.wings.samples.XmlStore
先ほど同様、特にエラーメッセージなどが表示されなければ成功だ。格納した内容については、管理コンソールから確認することができる。
以上、XprioriデータベースとJavaアプリケーションを連携する基本的な手法について紹介した。すでにあるRDBのデータも簡単にNXDBに移行できることが実感できたのではないだろうか。次回はデータベースの構造が頻繁に変更される「半定型データ」を扱い、XML DBではデータ構造の変更がもたらすインパクトが、アプリケーション内だけにとどまり、XML DBにはまったく影響を及ぼさないことを検証する。
▲このページのTOPへ