レベル: 中級 Anson Kokkat (ansonk@ca.ibm.com), Senior Software Engineer, IBM
2006年 10月 26日 IBM® DB2® 9 では pureXML™ の強力さを活用でき、しかもそれをアプリケーション開発環境に統合することができます。この強力な技術を Java™ アプリケーションに統合する方法を学び、また新しい DB2 Developer Workbench を使うことで開発を容易に進められることを学びましょう。
DB2 9 の新しい pureXML 機能を使った Java アプリケーションの開発を始めましょう。そしてアプリケーション開発環境に pureXML を統合しましょう。
DB2 9 の導入によって、皆さんは Developer Workbench などの強力な統合開発環境 (IDE) を手にしました。この記事を読み終われば、現在使用中の既存のアプリケーションで、あるいは新たに開発する Java アプリケーションで、pureXML を使って新たな機能を実現でき、また現在の環境の持つ機能に pureXML を活用することができます。この記事では、XML を使った JDBC アプリケーションを開発する際に突き当たる問題の解決を助けるために、そうした問題の診断方法を示し、また簡潔で機能豊富なプログラムを開発するための方法について説明します。
Universal JDBC driver
この記事では、V810 で導入された Type 4 Universal JDBC driver を取り上げます。Universal JDBC driver は推奨のドライバーとして、レガシー・ベースの cli ドライバー、または db2java.zip よりも優れたメモリー管理と安定性を実現しています。
レガシー・ベースの Type 2 ドライバーと Type 4 Universal driver とを区別するには、アプリケーションの中で使用する実際の接続ストリングを調べます。
下記では、接続ストリングの中に Type 2 ドライバーが使われています (COM.ibm.db2.jdbc.app.DB2Driver を使っています)。
リスト 1. Type 2 JDBC Driver の Connect
try {
// Load the DB2 JDBC Type 2 Driver with DriverManager
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
|
下記では、接続ストリングの中に Type 4 ドライバーが使われています (com.ibm.db2.jcc.DB2Driver を使っています)。
リスト 2. Type 4 JDBC Driver の Connect
try {
// Load the DB2 JDBC Type 4 Driver with DriverManager
Class.forName("com.ibm.db2.jcc.DB2Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
|
Type 4 ドライバーを使った場合の典型的なエラーを見てみましょう (こうしたエラーの処理方法は、後のセクションで説明します)。
Type 4 ドライバーを使っていてエラー条件に突き当たると、必ず何らかの EXCEPTION が得られます。jcc ドライバーでの典型的な例外は、次のようなものです。
リスト 3. 典型的な Type 4 の jcc 例外
[Thread:IdleRemover][SQLException@513098] Stack trace follows
com.ibm.db2.jcc.a.SqlException: Error executing a XAResource.commit(),
Server returned XAER_RMFAIL
at com.ibm.db2.jcc.c.ic.a(ic.java:2981)
at com.ibm.db2.jcc.c.c.n(c.java:494)
at com.ibm.db2.jcc.a.p.m(p.java:1180)
at com.ibm.db2.jcc.a.p.w(p.java:1381)
at com.ibm.db2.jcc.c.b.w(b.java:3444)
at com.ibm.db2.jcc.a.p.v(p.java:1362)
at com.ibm.db2.jcc.c.c.v(c.java:618)
at com.ibm.db2.jcc.a.dc.close(dc.java:67)
|
上記のエラー・コードの大部分は意味不明であり、エンドユーザーには役に立たないかもしれませんが、エラー・メッセージのテキストは、問題の本質に近づくために役に立ちます。上記のエラー・メッセージの原因を見つけるためには、DB2 Technical Support の Web サイトを検索し、これが既知の問題かどうかを調べるのが一番です。
pureXML
DB2 9 で XML の力を引き出し、多くの機能を活用するための方法を解説した記事は、既に無数に書かれています。この記事でもその一部を解説しますが、XML を使った JDBC アプリケーションを開発する際に注意すべきことは、使用するメソッドを XQuery そして SQL/XML で取り出し、そうしたメソッドをアプリケーションに統合するに過ぎない、ということを忘れないことです。
DB2 9 は、SQL データを保管でき、そして独自のネイティブ・フォーマットで XML データを保管できる唯一のデータ・サーバーであり、そこに DB2 9 の強力さがあります (このネイティブ・フォーマットが pureXML と呼ばれます)。pureXML の実際的な使い方は、DB2 9 の中に保管された場合によくわかります。これは pureXML が構文解析された表現で保管されるためです。また pureXML はインデックスを効率的に使っているため、実際のエンジン内からアクセスすると、想像以上の力を発揮します。
DB2 XML を独自の列として統合する上で、DB2 9 がいかに強力か、例を見てみましょう。
リスト 4. XML 列を使った CREATE TABLE
CREATE TABLE Customer (Cid BIGINT NOT NULL PRIMARY KEY,
Info XML,
History XML)
|
上記の例を見ると、XML 型の「Info」という列を容易に作成できることがわかります。DB2 で他の任意の列を作成する場合と、まったく同じ容易さです。
XML の使いやすさをリレーショナル・フォーマットの中に統合できるため、データをネイティブ形式で保管し、その利点を活用しようとする編成が増えてきています。
アプリケーション開発という面では、リレーショナル・データを処理する場合であれ XML データを処理する場合であれ、プログラマーは必要に応じて SQL API または XML API を使うことができます。
こうした知識を JDBC アプリケーションの中で活用する方法を学び、そして XML データの使い方を調べてみましょう。現在では、単純に XQuery または SQL/XML の力を活用することができ、ここで説明することを JDBC アプリケーションに適用すればよいのです。
XQuery の動作に関しては、XQuery は SQL の中に埋め込まれており、そして SQL は既に JDBC でサポートされています。つまり必要なことは、既に XQuery が埋め込まれた SQL ステートメントを、Java アプリケーションの中に入れることだけです。
DWB (DB2 Developer Workbench)
では、DWB をインストールしてセットアップし、XML を使った独自の Java アプリケーションを作成するまでの手順を説明しましょう。
DWB は、DB2 UDB Software Support
site からダウンロードすることができます。このページから、クライアントのダウンロードに進みます。「Fixes By Version」の下に、DWB をダウンロードする場所へのリンクがあります。また、Developer
Workbench download site からもダウンロードすることができます。
図 1 のスクリーン・ショットを見ると、DWB をダウンロードする場所がわかると思います。
図 1. DWB をダウンロードする場所
DWB をダウンロードできれば、準備完了です。注意: DWB は DB2 とは別にインストールされます。そのため、Windows から起動する際には、別の項目として表示されます (例えば、Start > All Programs > IBM DB2 Developer Workbench > DB2 Developer Workbench 9.1 > DB2 Developer Workbench など)。
- DWB を起動した後の最初の画面で、ワークスペースに名前を付けるように指示されます。名前の付け方は任意です。ここでは「Test」という名前にします。
図 2. Workspace launcher
OK を選択します。
- DWB の画面が表示されたら、早速ワークベンチに入ります。画面上部の右側の角にある矢印をクリックします。
図 3. DWB の起動画面
矢印をクリックすると、Workbench ビューが表示されます。ここでは、すべての領域 (Data Project Explorer や Database Explorerなど) や、他の IDE と同じような、アプリケーション開発に関連するさまざまなタブが表示されています。
図 4. DWB のビュー
- これで、Java プロジェクトを開始するための準備が整いました。まず、Java パースペクティブに切り替えます。Window > Open Perspective > Other で Java を選択し、そして OK をクリックします。
図5. DWB での Java パースペクティブ
- 新しい Java プロジェクトを作ることから始めます (File > New > Project)。Java フォルダーを拡張してJava Project を選択し、そして Next をクリックします。
図 6. 新しいプロジェクトのビュー
- 次の画面では、プロジェクトに名前を付け、そして Finish をクリックします。ここでは、このプロジェクトを「TestLab」と呼ぶことにします。
図 7. プロジェクト名
- 今度は、この Java プロジェクトのための全コードと、必要なコンポーネントを追加しましょう。まず新しいクラスを作成します (File > New > Class)。public static void main(String[] args) を含んだチェックボックスを選択し、main メソッドを含めます。Package に lab と入力します。
図 8. 新しい Java クラス
- これで、この Java アプリケーションの全コンポーネントが見えるようになります。Java アプリケーションの中に新しいコンポーネントを作成する上で、ソースを追加することも、この開発環境の使い方も、非常に直感的であるということがわかると思います。
図 9. Java コードのビュー
- 他のことをする前に、適切な JAR ファイルをプロジェクトにインポートする必要があります。db2jcc.jar が実際の DB2 Universal JDBC driver であり、これをこのプロジェクトで使います。プロジェクト (この場合は TestLab ) の上で右クリックし、Properties を選択します。
図 10. Java プロジェクトの Properties
-
Java Build Path > Libraries タブと進み、Add External Jars を選択します。
図 11. Java Build Path
- Universal JDBC driver の JAR ファイル を探します。通常は、$DB2PATH/sqllib/java ディレクトリーにあります。
図 12. Java Build Path
- db2jcc.jar ファイルと db2jcc_license_cu.jar ファイルを選択します。
- Java プログラムの getConnection( ) メソッドが、そのシステムにとって適切な userid/password を含んでいることを確認します。
これで、Java アプリケーションを実行する準備が整いました。
- メニュー・バー Run から、Run を選択します。
- すべてのデフォルトを選択し、New ボタンをクリックします。新たに作成されたすべてのファイルが、プロジェクトの一部として表示されます。
上記は、DWB で Java アプリケーションを開発するための手順を、順を追って示したものです。今度は、XML データを利用するための特定のコードを見てみましょう。
XML データを利用する Java プログラムを見るとわかるように、実際にすることは、XML データに対してクエリーを作成する必要があるという知識を、そのまま直接 JDBC アプリケーションに当てはめるだけです。
この Java アプリケーションの最初のステップは、DB2Xml メソッドをインポートすることです。
リスト 4. jcc パッケージをインポートする
import com.ibm.db2.jcc.DB2Xml;
|
このインポートは他のインポートとは別に、追加として行います。
Java アプリケーションの典型的な流れと、JDBC アプリケーションの基本部分を見てみましょう。
- データベースに接続する
リスト 5. getConnection
connection = DriverManager.getConnection(url, user, pass);
|
- ステートメント -- 実行中の任意の SQL です。
リスト 6. prepareStatement
PreparedStatement stmt = connection.prepareStatement(sql);
|
- ResultSet -- resultset を受け取ります。
リスト 7. resultset
ResultSet resultSet = stmt.executeQuery();
|
実際のアプリケーションでは、他の方法でも resultset を取得することができます。
- XML 値をストリームし、そして getBinrarySteam( ) のようなものを使います。
リスト 8. resultset.getBinaryStream( )
InputStream inputStream = resultSet.getBinaryStream(1);
|
- あるいは、DB2XML や SQLXML を使って値を取得することもできます。
リスト 9. resultset.getObject( )
DB2Xml db2xml = (DB2Xml) resultSet.getObject(1);
|
XML データを処理する際に起こる可能性のある、異なる 2 つのシナリオを見てみましょう。
Select:
リスト 10 はアプリケーションの典型的な部分として、XMLProduct 表から選択する方法を示しています。
リスト 10. XML 値を選択する
String sql = "SELECT PID, DESCRIPTION from XMLPRODUCT where PID = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "100-105-09");
ResultSet resultSet = stmt.executeQuery();
String xml = resultSet.getString("DESCRIPTION"); // or
InputStream inputStream = resultSet.getBinaryStream("DESCRIPTION"); // or
Reader reader = resultSet.getCharacterStream("DESCRIPTION"); // or
DB2Xml db2xml = (DB2Xml) resultSet.getObject("DESCRIPTION");
|
このアプリケーションを見てもわかるように、XML DESCRIPTION 値を取得する Java メソッドは、いくつか種類があります。上記のプログラムでは、次のようなメソッドが使われています。
- getString( )
- getBinaryStream( )
- getCharacterStrem( )
- getObject( )
Insert:
リスト 11 はアプリケーションの典型的な部分として、XMLProduct 表に挿入する方法を示しています。
リスト 11. XML ファイルを挿入する
String sql = "INSERT INTO xmlproduct VALUES(?, ?)";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "100-105-09");
File binFile = new File("productBinIn.xml");
InputStream inBin = new FileInputStream(xmlFile);
stmt.setBinaryStream(2, inBin, (int) binFile.getLength());
stmt.execute();
|
上の例では、productBinIn.xml という XML ファイルを挿入しています。つまりこのコードは、上記のように DWB に挿入して実行するコードの典型と言うことができます。
上記の例のポイントは、XML データを選択する場合にも、あるいは表に挿入する場合にも、上記のコードで XML データを活用できるという点です。そして実際のコードは DWB に移植でき、他の Java プログラムを実行するのと同じようにそのコードを実行することができます。また、他の機能も用意されています。例えば DWB に付属するデバッガーを使えば、アプリケーション開発が容易になります。
DB2 のアプリケーション開発環境の中では、Java アプリケーションの必要に応じて、Type 4 の純 Java ドライバーを利用することができます。pureXML は今や DB2 9 の強力な一部分であり、Java アプリケーションの中で XML を活用すれば、DWB のようなツールを使ってスタンドアローンの Java アプリケーションを容易に作成することができます。Java での XML メソッド活用を進めるための、より豊富な機能への拡張はまだまだこれからです。pureXML の能力を活用したいと望む Java 開発者にはワクワクする時代と言えるでしょう。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Anson Kokkat は、DB2 UDB Advanced Support team のソフトウェア開発チームのリーダーです。1999 年に University of Western Ontario をコンピューター技術工学の学位で卒業後、IBM で働いています。彼は、多様なプラットフォームによる DB2 アプリケーション開発のさまざまな側面に携わってきました。専門分野は、WebSphere と DB2 との統合、JDBC、ストアード・プロシージャー、そして .NET などです。最近では、ヨーロッパで開催された Information Management conference にて、新しい DB2 Universal Driver に関する発表者に選ばれました。 |
記事の評価
|