この文章は Apache Geronimo アプリケーション・サーバーの持つ JDBC 機能を解説します。JDBC 機能のデモンストレーションでは、JSP、サーブレットによりウェブ関連の機能や組み込みデータベースの Derby を扱う単純な Inventory アプリケーションを利用します.
Inventory アプリケーションはデータベースへの接続方法にサーバー・プロバイダー・インターフェース (SPI) を利用します。この方法では、アプリケーションはデータベースとの接続確立のために JDBC データソース・インターフェースを利用します。これが J2EE アプリケーションの接続方法としてふさわしいのは、以下のいくつかの理由によります。
- プログラム・コードは全体的にデータベース非依存となります。ドライバー情報、データベースの位置情報、構成パラメーターが J2EE サーバー内に保持されます。
- コネクション・プーリングの利用が可能です。J2EE サーバー接続マネージャーは効果的に接続を処理し、性能や拡張性を改善します。
- J2EE サーバーの一部としてビジネス・ロジックを実装しているエンタープライズ JavaBeans (EJB) を利用してデータベースが利用できるようになります。必須ではありませんが、 EJB 層の実装によりアプリケーションの構造に対して高い拡張性あたえる基礎となります。
この文章を読み終えると、Geronimo の JDBC 機能、たとえばデータベース・プールの定義やデータソースを使ってのデータベース接続などの機能を最大限活用することができるようになるでしょう。
この文章は以下のセクションで構成されています。
JDBC 機能の概略
アプリケーション・サーバーへの JDBC の実装は、アプリケーション・サーバーごとに異なります。以下の表は Apache Geronimo の JDBC 機能一覧です。
Feature |
Description |
---|---|
JDBC access |
Geronimo は JDBC を直接統合していませんが、総括的な J2CA フレームワークを通しての接続をサポートしています。TranQL プロジェクトは様々なデータベース用 J2CA アダプターです。 |
JCA implementation |
Geronimo は JCA 1.5 仕様をサポートしています。これは JCA 1.0 仕様と下位互換です。 |
Data sources supported |
TranQL は各種データソースの総括的ラッパーです。 |
Data source failover |
TranQL は特定のデータベース (Apache Derby、Oracle、DB2 を含みます) 向けに特化されたドライバーを持っていますので、それらドライバーの拡張機能と密接に統合されます。 |
XA support |
XA トランザクション、ローカル・トランザクション、トランザクション無しをサポートしています。 |
Connection Manager Configurability |
J2CA フレームワークは異なるコネクション・フレームワークの組み込みを可能にするインターセプターを持ちます。 |
JTA implementation |
トランザクションのサポートは Geronimo Specific Transaction Managing フレームワーク と HOWL により与えられます。 |
Connection pooling and management |
カスタムの Geronimo コードと TranQL はコネクション・プーリングと管理に利用されます。 |
Legacy driver support |
Geronimo JDBC の TranQL−コネクター を通じて Geronimo のサポートする JDBC 3.0 と 2.1 の JCA ラッパーが与えられます。 |
アプリケーションの概略
この文章にある Inventory アプリケーションは、この手のアプリケーションの利用場面のうち、基本的な3つについてのみサポートします。
- アイテムを追加して在庫とする
- アイテムを入荷する
- アイテムを出荷する
アプリケーションのワークフローはアイテム情報を追加して在庫とするところから始まります。その後、物の入荷、出荷情報を受け付けます。これらの更新された情報はすべて組み込みの Derby データベースに保存されます。
Inventory ウェブ・アプリケーションは以下のページを持ちます。
- Welcome
- Add Item
- Receive Goods
- Issue Goods
次の図はアプリケーションのフロー図です。
アプリケーションの Welcome ページは現在の各アイテムの在庫数を表示します。Welcome ページを通してユーザはアイテムの追加、物の入荷、または物の出荷ページへ遷移できます。それらの処理が成功すると、在庫情報が更新された Welcome ページにリダイレクトされます。アイテムの追加ページではアイテムの在庫数を定義することができますので、在庫数0としてアイテム情報を保持することができます。物の入荷および出荷ページはそれぞれアプリケーションの入荷と出荷処理の役割をもちます。
アプリケーションの内容
Inventory アプリケーションは以下のパッケージとクラスを含みます。
- org.apache.geronimo.samples.inventory
- Item - Inventory でのアイテムを表します。
- org.apache.geronimo.samples.inventory.services
- InventoryManager - Inventory のもつ一連のサービスを表します。
- org.apache.geronimo.samples.inventory.dao
- ItemDAO - データベース接続方法をすべて含みます。
- org.apache.geronimo.samples.inventory.exception
- DuplicateItemIdException - アイテムの ID の重複を扱うために用意した例外です。
- NotSufficientQuantityException - 十分な在庫量が無い状況を扱うために用意した例外です。
- org.apache.geronimo.samples.inventory.util
- DBManager - データベース接続などを扱うデータベース関連処理です。
- org.apache.geronimo.samples.inventory.web
- AddItemServlet - サービス層にアイテム情報の追加機能を持たせます。
- IssueingServlet - サービス層にアイテムの出荷機能を持たせます。
- RecievingServlet - サービス層にアイテムの入荷機能を持たせます。
ウェブ・アプリケーションのファイルは以下のリストのとおりです。
|- jsp |- add.jsp |- error.jsp |- issue.jsp |- recv.jsp |- WEB-INF |- geronimo-web.xml |- web.xml |- welcome.jsp
geronimo-web.xml と web.xml ファイルによって、アプリケーションはデータソースを定義します。geronimo-web.xml は EAR ファイルに含まれ、データベース・プールへのリンクを持ちます。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"> <environment> <moduleId> <groupId>${pom.groupId}</groupId> <artifactId>${pom.artifactId}</artifactId> <version>${version}</version> <type>war</type> </moduleId> <dependencies></dependencies> </environment> <context-root>/inventory</context-root> <!-- define a reference name to the db pool--> <resource-ref> <ref-name>jdbc/InventoryDS</ref-name> <resource-link>InventoryPool</resource-link> </resource-ref> </web-app>
以下に Inventory アプリケーションの web.xml を示します。データソースを作成する際に利用される geronimo-web.xml と同じ名前を利用しています。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <display-name>AddItemServlet</display-name> <servlet-name>AddItemServlet</servlet-name> <servlet-class>org.apache.geronimo.samples.inventory.web.AddItemServlet</servlet-class> </servlet> <servlet> <display-name>IssueingServlet</display-name> <servlet-name>IssueingServlet</servlet-name> <servlet-class>org.apache.geronimo.samples.inventory.web.IssueingServlet</servlet-class> </servlet> <servlet> <display-name>RecievingServlet</display-name> <servlet-name>RecievingServlet</servlet-name> <servlet-class>org.apache.geronimo.samples.inventory.web.RecievingServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddItemServlet</servlet-name> <url-pattern>/add_item</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>IssueingServlet</servlet-name> <url-pattern>/issue</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RecievingServlet</servlet-name> <url-pattern>/recv</url-pattern> </servlet-mapping> <!-- reference name exposed as a datasource --> <resource-ref> <res-ref-name>jdbc/InventoryDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> </web-app>
geronimo-application.xml には、アプリケーションにデプロイする必要のあるデータベース・プールがあることを示します。データベース・プールは InventoryPool.xml に定義されています。また、ドライバーとして tranql-connector-ra-3.3.rar ファイルをデプロイする必要があることが記述されています。これら2つのファイルは生成された EAR ファイル内の最上位階層に置きます。
<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.1"> <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1"> <dep:moduleId> <dep:groupId>${pom.groupId}</dep:groupId> <dep:artifactId>${pom.artifactId}</dep:artifactId> <dep:version>${version}</dep:version> <dep:type>ear</dep:type> </dep:moduleId> </dep:environment> <module> <connector>tranql-connector-ra-1.3.rar</connector> <alt-dd>InventoryPool.xml</alt-dd> </module> </application>
次の重要なアプリケーションの記述はソースコードから定義されたデータソースへ接続するものです。これは DBManager クラスとして扱われます。
public static Connection getConnection(){ Connection con = null; try { Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/InventoryDS"); con = ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; }
サンプル・データベース
このサンプル・データベースは組み込みの Derby データベースを利用しています。サンプル・データベースの名前は InventoryDB で、2つの表を持ちます。ITEM 表と ITEM_MASTER 表です。それぞれの表の列は以下に記述します。
Table Name |
Fields |
---|---|
ITEM |
ITEM_ID (PRIMARY KEY) |
ITEM_MASTER |
ITEM_ID (PRIMARY KEY) |
ITEM 表は ITEM_MASTER 表の各アイテムの在庫数量を保持します。
ツールの利用
nventory サンプル・アプリケーションの開発、ビルドは次のツールを利用しています。
Apache Derby
Apache Derby は Apache DB サブ・プロジェクトであり、Java で実装されたリレーショナル・データベースです。サイズが小さく、Java に基づくソリューションに簡単に組み込めるものです。組み込みフレームワークに加え、Derby は Derby ネットワーク・サーバを利用することで、よくあるクライアント/サーバ・フレームワークもサポートします。
http://db.apache.org/derby/index.html
Apache Maven 2
Maven はエンタープライズ Java プロジェクト向けの有名なオープンソースのビルド・ツールです。 ビルド作業の負荷を軽減できるように設計されました。Maven では Ant や他の伝統的な make ファイルなどで利用されるタスク・ベースの手法ではなく、宣言的手法を利用して、プロジェクトの構成や内容が定義されます。このことにより、企業全体で開 発標準を適用することや、ビルド用スクリプトの記述やメンテナンスに必要な時間を削ることの助けとなります。宣言的で、ライフサイクルに基づく手法を使っ ていた Maven 1 は、伝統的なビルド方法よりも、多くの人にとって、根本的な発展となり、さらに Maven 2 はこの点を高めました。Maven 2 は次の URL からダウンロードできます。
http://maven.apache.org
サンプル・アプリケーションの構成、ビルド、デプロイ
以下のリンクから Inventory アプリケーションをダウンロードしてください。
Inventory
ファイルを解凍すると、inventory ディレクトリーが作られます。
ソース・コード
SVN からサンプルのソースコードをチェックアウトすることができます。
svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/inventory
構成
アプリケーションの構成は、データベースの作成とデータベースへ接続するコネクション・プールの定義を含んでいます。
データベースの作成とデータ追加
Apache Geronimo サーバーを始動した後、 Geronimo コンソールへログインし、以下の手順により InventoryDB を作成してください。
CREATE TABLE item( item_id VARCHAR(10) PRIMARY KEY, item_name VARCHAR(25), description VARCHAR(100) ); CREATE TABLE item_master( item_id VARCHAR(10) PRIMARY KEY, quantity INTEGER ); INSERT INTO item VALUES('001', 'Item 1', 'Test Item 1'); INSERT INTO item VALUES('002', 'Item 2', 'Test Item 2'); INSERT INTO item VALUES('003', 'Item 3', 'Test Item 3'); INSERT INTO item VALUES('004', 'Item 4', 'Test Item 4'); INSERT INTO item_master VALUES('001', 12); INSERT INTO item_master VALUES('002', 8); INSERT INTO item_master VALUES('003', 49); INSERT INTO item_master VALUES('004', 34);
- 左側の Console Navigation から DB Manager リンクを選択してください。
- データベース名として InventoryDB を入力し、Create ボタンをクリックしてください。
- Use DB 欄で InventoryDB を選択してください。
- テキストエディタで inventory/inventory-ear/src/main/resources ディレクトリーから InventoryDB.sql を開いてください。
- SQL Commands のテキストエリアに InventoryDB.sql の内容を貼りつけ、Run SQL ボタンを押してください。
ビルド
Inventory アプリケーションはソースコードからのビルドに利用できる pom.xml スクリプトが含まれます。コマンド・プロンプトを利用して inventory ディレクトリーへ移動し、mvn install コマンドを入力するとビルドされます。inventory フォルダーの下に inventory-ear-2.0-SNAPSHOT.ear が作られます。これで Geronimo アプリケーション・サーバーへ Inventory アプリケーションをデプロイする準備ができました。
デプロイ
Geronimo Console の利用によって、サンプルアプリケーションのデプロイはかなり簡単です。
- Console Navigation パネルから Deploy New を選択してください。
- Archive 入力欄に inventory フォルダーの inventory-ear-2.0-SNAPSHOT.ear を読み込んでください。
- Install ボタンを押してアプリケーションをサーバーへデプロイしてください。
Back to Top
サンプル・アプリケーションのテスト
サンプル・アプリケーションをテストするには、ブラウザーを開いて http://localhost:8080/inventory を入力してください。 Inventory アプリケーションの Welcome ページが表示され、そこには注目ボードがあります。
ユーザーは Welcome ページからアイテムの追加、物の入荷、物の出荷機能へ接続できます。
まとめ
この文章では Geronimo アプリケーション・サーバーでの JDBC 機能の利用方法を示しました。説明にしたがってサンプル・アプリケーションを順々にビルド、デプロイ、テストすればこれらの機能がよく分かります。
この文章の注目点は、以下の通りです。
- Apache Geronimo の JDBC 機能
- Geronimo に組み込まれた Derby データベースを利用してデータベースの作成、データの追加
- データベースへの接続のためのデータベース・プール計画のデプロイ
- Geronimo において、定義されたプールを通じてデータベースへ接続するウェブ・アプリケーションのデプロイ