Apache Geronimo の JNDI ネーミングおよび Java リソース接続プール: 第 1 回 データ・ソース接続

JNDI を使って、データ・ソース、Java Messaging Services、メール・セッション、そして URL 接続のための接続プールにアクセスする

JNDI (Java™ Naming and Directory Interface) は、Apache Geronimo アプリケーション・サーバーにある接続プールとのインターフェースです。このインターフェースを介して、開発者は EJB (Enterprise Java Bean) をはじめとするすべての Java オブジェクトにアクセスします。この連載記事では、JNDI を使用してデータ・ソース、JMS (Java Messaging Services)、メール・セッション、そして URL 接続のための接続プールにアクセスする方法をそのコンセプトとともに説明します。

Dale de los Reyes (dreyes4@hotmail.com), Freelance writer

Dale de los Reyes は 1996 年、California Polytechnic State University, San Luis Obispo でコンピューター・サイエンスの学位を取得し、J2EE、Microsoft® Windows® 対応 C++、メインフレーム対応 COBOL でのアプリケーション開発の経験を積んでいます。余暇は写真、武道、そして独自のプロジェクトの追及に費やしています。



2006年 11月 21日

JNDI について

JNDI は、オブジェクトに名前を関連付けるメソッド、そしてこれらのオブジェクトをディレクトリー内で名前で検索するメソッドをアプリケーションに提供するアプリケーション・プログラミング・インターフェース (API) またはライブラリーです。連載第 1 回目のこの記事では、Geronimo、JNDI、およびデータ・ソース接続プールの相互関係、そしてデータ・ソース接続を作成する方法と、JNDI を使って Customer Serviceユーティリティーという単純な Geronimo アプリケーションでデータ・ソース接続にアクセスする方法について説明します。

データ・ソースとは、アプリケーション内に含まれるデータ (通常はデータベース) の実際のソースへの接続を生成するオブジェクトまたはファクトリーのことです。Java EE (Java Platform, Enterprise Edition) でのデータ・ソースは、データベース接続プール (すぐに利用可能なデータベース接続のグループ) を指します。データ・ソース (またはデータベース・プール) を作成する理由は、1 つの接続をオープンするだけでも CPU に負担のかかる操作ですが、データ・ソースによってアプリケーションのパフォーマンスが向上するためです。

Customer Service ユーティリティー (この記事の「ダウンロード」セクションから入手可能) は単純な Web アプリケーションで、これを使用して基本的なカスタマー情報をデータベースに保管します。この記事では、このユーティリティーを Apache Ant 1.6.5 および Java 1.4.2_10 でビルドして Tomcat 搭載の Geronimo 1.1 でデプロイし、Geronimo に組み込まれている Apache Derby データベースを使用します (Geronimo をダウンロードするためのリンクは、この記事の終わりにある「参考文献」セクションに記載されています)。次のセクションではまず、このデータベースとデータ・ソースを Geronimo コンソールで作成する方法を説明します。


Geronimo をセットアップする

Geronimo コンソールでは、Java EE コンポーネントをわかりやすい方法で管理できます。このコンソールには、Geronimo を起動した後、http://localhost:8080/console でアクセスします。デフォルトのユーザー名とパスワードはそれぞれ、system と manager です。

まずは以下の手順に従ってください。

  1. Console Navigation パネルの左下にある DB Manager リンクをクリックします。Derby データベース・マネージャーが表示されます。
  2. Create DB フィールドに CustomerServiceDatabase と入力し、Create ボタンをクリックしてカスタマー・サービス・データベースを作成します。
  3. Use DB プルダウン・メニューから CustomerServiceDatabase を選択してデータベース・テーブルを作成します。
  4. リスト 1 に示す SQL スクリプトのコンテンツをテーブルに貼り付け、Run SQL ボタンをクリックします。リスト 1 の SQL スクリプトは、ソース・コードに含まれているのでご注意ください。
リスト 1. SQL スクリプト
CustomerService-Part1.sql
create table customers (
   customerid varchar(10) primary key,
   fullname varchar(30),
   emailaddress varchar(30),
   interests varchar(100)
);
insert into customers values ('A100','John Doe10','Doe10@work.com','Java,Open Source, 
Computer Graphics');
insert into customers values ('b100','Jane Doe20','Doe20@home.net','Budget Travel, New 
Zealand, Martial Arts');

カスタマー・サービス・データベースが Derby に作成されているはずです。このデータベースには、Customers というテーブルが 1 つあるだけで、テーブルにはエントリーが 2 つだけ含まれています。Application リンク、次に View Contents リンクをクリックして適切に初期化すると、テーブルは図 1 のようになります。

図 1. 初期化した後のカスタマー・サービス・データベース
customer service database after initialization

次に、上記で作成したデータベースのための接続プールを作成します。

  1. 左側の Console Navigation パネルで、Database Pools リンクをクリックします。
  2. Using the Geronimo database pool wizard リンクをクリックし、以下の手順に従います。
    • Step 1: Select Name and Database ページで、Name of Database Pool フィールドに CustomerServicePool と入力します。Database Type プルダウン・メニューから Derby embedded を選択し、Next をクリックします。
    • Step 2: Select Driver, JAR, Parameters ページで、Driver JAR プルダウン・メニューから org.apache.derby/derby/10.1.1.0/jar を選択します。DB User Name フィールドには app と入力し、DB Password は空白のままにします。Database フィールドには CustomerServiceDatabase と入力して Next をクリックします。
    • Step 3: Final Pool Configuration ページで、Driver Status フィールドに Loaded Successfully と表示されていることを確認します。Connection Pool Parameters は空白のままで構いません。Test Connection ボタンをクリックして次のページに進みます。
    • Step 4: Test Connection ページで、Test Result フィールドに Connected to Apache Derby 10.1.1.0 と表示されていることを確認し、Deploy をクリックします。図 2 には、新しく作成された接続プールが表示されています。
図 2. 新規に作成された CustomerServicePool データ・ソース
Newly created CustomerServicePool data source

これで、データベース (CustomerServiceDatabase) とデータ・ソース (CustomerServicePool) が Geronimo 上で構成およびデプロイされ、使用できる状態になりました。次に、これらのオブジェクトを JNDI で宣言する方法を説明します。


Geronimo デプロイメント記述子の作成方法

Geronimo にデプロイするコンポーネントにはいずれも、デプロイメント記述子が必要です。Step 4: Test Connection ページにある Show Plan ボタンからわかるように、上記で作成した CustomerServicePool でも記述子ファイルを使用しています。アプリケーション開発者が作成する最も一般的なコンポーネントは、EJB (JAR ファイル)、Web アーカイブ (WAR ファイル)、そしてアプリケーション・アーカイブ (EAR ファイル) です。Customer Service ユーティリティーは、これらのコンポーネント・タイプのそれぞれを利用します。

記述子ファイルの構成は重要です。なぜなら、記述子ファイルは、これらのコンポーネントを Geronimo で使用できるようにする手段だからです。また、記述子ファイルを構成することによって JNDI 名を指定の Java オブジェクトに関連付けることにもなります。Geronimo にデプロイされるコンポーネントには通常、標準 Java デプロイメント記述子、そして Geronimo 固有のデプロイメント・プランという 2 つのデプロイメント・ファイルがあります。1 次リソースは CustomerServiceDatabase で、データ・ソースである CustomerServicePool がこのデータベースにアクセスするための多数の接続を提供します。ユーザーがカスタマー情報を保管するには、まず Web インターフェースにアクセスし、フィールドに情報を入力します。これらのフィールドが、セッション Bean を参照する Java Bean に渡されます。このセッション Bean は、エンティティー Bean を参照して基本データベース操作を実行することにより、カスタマー・データに作用します。エンティティー Bean はカスタマーのテーブルに含まれる 1 つの行を表す Java オブジェクトで、CustomerServicePool を参照してデータベースにアクセスするコンポーネントです。リスト 2 に、このエンティティー Bean の標準 Java デプロイメント記述子を記載します。

リスト 2. CustomerEJB-ejb.xml のリスト抜粋
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" 
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>
   <enterprise-beans>
      <entity>
         <ejb-name>CustomerEntityBean</ejb-name>
         <home>com.service.customer.ejb.CustomerHome</home>
         <remote>com.service.customer.ejb.Customer</remote>
         <ejb-class>com.service.customer.ejb.CustomerEntityBean</ejb-class>
         <persistence-type>Container</persistence-type>
         <resource-ref>
            <res-ref-name>jdbc/CustomerServiceDataSource</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
         </resource-ref>
      </entity>
   </enterprise-beans>
</ejb-jar>

上記のリストでは、4 つのタグに注目してください。まず、<ejb-name> タグでこのエンティティー Bean の名前を指定しています。<persistence-type> タグでは、このエンティティー Bean がコンテナー管理パーシスタンス (CMP) を使用することを示しています。つまり、すべてのデータベース操作が Geronimo によって自動的に処理されるということです。<res-ref-name> タグでは、検索を実行するときに使用する JNDI 名を指定しています。CMP を使用したエンティティー Bean のインプリメンテーションは必要最小限で、JNDI 検索は明示的にコード化されません。ただし、<res-ref-name> タグ内での宣言はやはり必要です。最後に、<res-type> タグで JNDI 名に関連付けるオブジェクト・タイプを指定しています。リスト 3 に、このエンティティー Bean の Geronimo 固有の付随ファイルを示します。

リスト 3. CustomerEJB-openejb.xml のリスト抜粋
<?xml version="1.0" encoding="UTF-8"?>

<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
          xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
   <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>CustomerEJB</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>jar</dep:type>
      </dep:moduleId>

      <dep:dependencies>
         <dep:dependency>
            <dep:groupId>console.dbpool</dep:groupId>
            <dep:artifactId>CustomerServicePool</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>rar</dep:type>
         </dep:dependency>
      </dep:dependencies>

      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <cmp-connection-factory>
      <resource-link>CustomerServicePool</resource-link>
   </cmp-connection-factory>

   <enterprise-beans>
      <entity>
         <ejb-name>CustomerEntityBean</ejb-name>
         <jndi-name>CustomerRemoteEntity</jndi-name>

         <resource-ref>
            <ref-name>jdbc/CustomerServiceDataSource</ref-name>
            <resource-link>CustomerServicePool</resource-link>
         </resource-ref>
      </entity>
   </enterprise-beans>
</openejb-jar>

<ejb-name> の値と付随する記述子ファイルの <ejb-name> の値は一致していなければなりません。<jndi-name> タグでは、アプリケーション・クライアントのみが使用する JNDI 名を指定しています。これらのクライアントは、アプリケーション・アーカイブ (.ear) ファイルにはバンドルされていません。<ref-name> タグは、リスト 2 に示した <res-ref-name> タグ内の JNDI 名に対応します。<resource-link> タグで、Geronimo コンソールで作成された CustomerServicePool を <ref-name> の名前に関連付けています。

参考のために言っておきますが、Geronimo 固有のデプロイメント記述子のフォーマットはバージョン 1.1 で変更されています。前のバージョンでは、ヘッダー内で configID および parentID 属性を使用してオブジェクトの ID と依存関係を指定していました。このフォーマットは現在、Apache Maven 形式の命名規則に基づいてモジュール化された構造に置き換わっています。この構造には、4 つの要素が groupID/artifactID/version/type のパターンで含まれます。この命名パターンは、geronimo-1.1/repository のディレクトリー構造に対応します。

上記の記述子ファイルにある <dep:XXX> タグは、この命名規則に従っています。例えば、依存関係である CustomerServicePool は console/dbpool/CustomerServicePool/1.0 の Geronimo リポジトリー内にあります。新しい命名規則に従うと、Geronimo 1.0 にデプロイされたアプリケーションは更新する必要があります。バージョン 1.1 のユーザー・マニュアルにはこの更新方法に関するセクションが設けられていますが、Geronimo の今後のリリースではこの命名規則をサポートするため、1.1にデプロイしたアプリケーションについては、記述子を更新しなくても新しいリリースにデプロイできるはずです。

それでは、リスト 4 でセッション Bean の構成を続けましょう。

リスト 4. ProcessCustomerEJB-ejb.xml のリスト抜粋
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 
2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>ProcessCustomerSessionBean</ejb-name>
         <home>com.service.customer.ejb.ProcessCustomerHome</home>
         <remote>com.service.customer.ejb.ProcessCustomer</remote>
         
<ejb-class>com.service.customer.ejb.ProcessCustomerSessionBean</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>

         <ejb-ref>
            <ejb-ref-name>ejb/CustomerEntityBean</ejb-ref-name>
            <ejb-ref-type>Entity</ejb-ref-type>
            <home>com.service.customer.ejb.CustomerHome</home>
            <remote>com.service.customer.ejb.Customer</remote>
         </ejb-ref>
      </session>
   </enterprise-beans>
</ejb-jar>

上記の <ejb-name> タグでは、セッション Bean の名前である ProcessCustomerSessionBean を指定しています。<ejb-ref-name> タグでは、アプリケーション内のコンポーネントが使用する JNDI 名を指定しています。この場合、セッション Bean はエンティティー Bean で検索を実行します。対応する Geronimo 固有のプランをリスト 5 に記載します。

リスト 5. ProcessCustomerEJB-openejb.xml のリスト
<?xml version="1.0" encoding="UTF-8"?>

<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.1"
        xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1"
        xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1"
        xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
   <dep:environment>
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>ProcessCustomerSessionBean</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>jar</dep:type>
      </dep:moduleId>

      <dep:dependencies/>
      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <enterprise-beans>
      <session>
         <ejb-name>ProcessCustomerSessionBean</ejb-name>
         <jndi-name>ProcessCustomerRemoteSessionBean</jndi-name>

         <ejb-ref>
            <ref-name>ejb/CustomerEntityBean</ref-name>
            <ejb-link>CustomerEntityBean</ejb-link>
         </ejb-ref>
      </session>
   </enterprise-beans>
</openejb-jar>

<dep:moduleId> では、このコンポーネントのフルネームを指定しています。エンティティー Bean と同様に、<ejb-name> タグは前のリストに示した標準記述子の <ejb-name> と一致していなければなりません。また、<jndi-name> タグにはアプリケーション・クライアントのみが使用する JNDI 名が含まれています。最後に、<ejb-ref> タグで JNDI 名を EJB の名前に関連付けています。次は、Java Bean からセッション Bean を参照するWeb アーカイブです。その標準デプロイメント記述子をリスト 6 に示します。

リスト 6. web.xml のリスト抜粋
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         version="2.4">

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <ejb-ref>
    <ejb-ref-name>ejb/ProcessCustomerSessionBean</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <home>com.service.customer.ejb.ProcessCustomerHome</home>
    <remote>com.service.customer.ejb.ProcessCustomer</remote>
  </ejb-ref>
</web-app>

上記で主要な項目は <ejb-ref> タグです。このタグは、セッション Bean の検索に使用される JNDI 名の宣言方法を示しています。

この Web アーカイブに対する Geronimo 固有のプランは極めて単純で、Web アーカイブのフルネームを定義し、Web ブラウザーからアクセスするときにアプリケーションを見つけられるようにコンテキスト・ルートを指定するというものです (リスト 7 を参照)。

リスト 7. geronimo-web.xml のリスト
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"
         xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.1">
   <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.1">
      <dep:moduleId>
         <dep:groupId>default</dep:groupId>
         <dep:artifactId>CustomerService-web</dep:artifactId>
         <dep:version>1.0</dep:version>
         <dep:type>war</dep:type>
      </dep:moduleId>

      <dep:dependencies/>
      <dep:hidden-classes/>
      <dep:non-overridable-classes/>
   </dep:environment>

   <context-root>/service</context-root>
</web-app>

Customer Service ユーティリティーは .ear ファイルとしてデプロイされるため、このユーティリティーには application.xml および geronimo-application.xml という 2 つの記述子ファイルがあります。ただし、どちらのファイルにも JNDI 宣言が含まれていないため、ここでは説明しません。JNDI 名を宣言して EJB コンポーネントに関連付ける手順は、これですべてです。次のセクションでは、これらのオブジェクトをコードでどのように検索するかを説明します。


Customer Service ユーティリティー

Customer Service ユーティリティーの準備はほとんどできています。次のステップは、JNDI を使用してこれらの EJB を呼び出し、データベースにアクセスすることです。リスト 8 に示すように、完全な JNDI ストリングは命名規則に従っています。

リスト 8. customer.properties での JNDI 名のリスト
# Specify JNDI names here
jndi.customer.ejb=java:/comp/env/ejb/CustomerEntityBean
jndi.process.ejb=java:/comp/env/ejb/ProcessCustomerSessionBean

前述の手順で EJB 記述子の <ejb-ref-name> タグで宣言した名前が、完全な JNDI 名のコンテキストでリストされます。推奨される命名規則では、オブジェクトには対応するドメインを先頭に付けるように定めています。そのため、エンティティー Bean とセッション Bean はどちらも ejb/ で始まっています。エンティティー Bean の記述子ファイルで宣言された CustomerServiceDataSource はデータベースに関連するため、jdbc/ を使用します。リスト 9 のコードは、セッション Bean 内からフルネームを使って CustomerEntityBean の JNDI 検索を実行する方法を示しています。

リスト 9.ProcessCustomerSessionBean.java のリスト抜粋
package com.service.customer.ejb;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

public class ProcessCustomerSessionBean implements SessionBean
{
   private ResourceBundle    bundle = null;
   private SessionContext    context = null;
   private CustomerHome      customerHome = null;
   private String            JNDI_CUSTOMER_EJB = null;

   // Create method(s)
   public void ejbCreate()
      throws CreateException
   {
      try
      {
         doJNDILookups();
      } // end try

      catch (Exception e)
      {
         throw new CreateException("ejbCreate: " + e.getMessage());
      } // end catch
   } // end ejbCreate

   // Support methods
   private void doJNDILookups()
      throws NamingException, ClassCastException
   {
      Object objref = null;
      InitialContext initial = null;

      bundle = ResourceBundle.getBundle("customer", Locale.getDefault(), 
ProcessCustomerSessionBean.class.getClassLoader());
      JNDI_CUSTOMER_EJB = bundle.getString("jndi.customer.ejb");

      initial = new InitialContext();
      objref = initial.lookup(JNDI_CUSTOMER_EJB);
      customerHome = (CustomerHome)PortableRemoteObject.narrow(objref, 
CustomerHome.class);
      System.out.println("looking up: " + JNDI_CUSTOMER_EJB);
   } // end doJNDILookups
} // end ProcessCustomerSessionBean

リスト 9 での主要な項目は、doJNDILookups メソッドです。まず、完全な JNDI 名が customer.properties ファイルから取得されます。次に、InitialContext が作成され、JNDI 名で検索が実行されます。最後に narrow メソッドのチェックによって、JNDI から取得したオブジェクトを対象のオブジェクト・タイプであるCustomerHome にキャストできることが確実にされます。リスト 10 は、Java Bean から検索を実行する方法です。

リスト 10. CustomerServiceJavaBean.java のリスト抜粋
public class CustomerServiceJavaBean
{
   private ProcessCustomerHome processHome = null;
   private ResourceBundle      bundle = null;
   private String              JNDI_PROCESS_EJB = null;

   public CustomerServiceJavaBean()
   {
      InitialContext initial = null;
      Object objref = null;

      bundle = ResourceBundle.getBundle("customer", Locale.getDefault(), 
CustomerServiceJavaBean.class.getClassLoader());
      JNDI_PROCESS_EJB = bundle.getString("jndi.process.ejb");

      try
      {
         initial = new InitialContext();
         objref = initial.lookup(JNDI_PROCESS_EJB);
         processHome = (ProcessCustomerHome)PortableRemoteObject.narrow(objref, 
ProcessCustomerHome.class);
         System.out.println("looking up: " + JNDI_PROCESS_EJB);
      } // end try

      catch (Exception e)
      {
         e.printStackTrace();
      } // end catch
   } // end CustomerServiceJavaBean
} // end CustomerServiceJavaBean

ProcessCustomerSessionBean を取得する手順は、エンティティー Bean の検索と同様です。ただし今回に限っては JNDI 名が異なるため、ProcessCustomerHome クラスを使用して JNDI から取得したオブジェクトが確認されています。

これで、Customer Service ユーティリティーを Geronimo にデプロイする準備が整いました。以下の手順に従ってください。

  1. CustomerService/resources/build.properties ファイルを修正し、ディレクトリー・ロケーションが正しく定義されていることを確認します。
  2. 次に、コンソールを開いてディレクトリーを CustomerService/build.xml がある場所に変更し、ant と入力します。これによって、アプリケーションのビルドとデプロイメントが行われ、http://localhost:8080/service でアクセスできるようになります。

図 3 に、データ入力ページの外観を示します。

図 3. Customer Service ユーティリティーのデータ入力ページ
Data entry page for Customer Service utility

この時点で、最も基本的なカスタマー情報だけがデータベースに保管されます。

最後に気を付けなければならない点が 1 つあります。開発者が Geronimo のコンソールから Derby データベースにアクセスした後、Customer Service ユーティリティーにアクセスしようとすると (あるいはその逆)、SQL Exception エラーが発生する場合があります。Geronimo をリブートすれば、そのエラーはいったん解消されますが、別の開発者がデータベースにアクセスすると同じ例外が再び発生します。この問題は、Geronimo 1.1 User Manual の最後にある 1.0 のマイグレーションに関するセクションに記載されている状態に関係しているようです (「参考文献」のリンクを参照)。

この状態は、データベース接続プールが Derby (org.apache.derby/derby/10.1.1.0/jar) または Derbynet (org.apache.derby/derbynet/10.1.1.0/jar) ドライバーに依存している場合に発生します。この依存関係をそのままにしておくと、Derby のもう 1 つのコピーが別のクラス・ローダーにロードされるため、SQL Exception の原因となります。 Geronimo データベース・プール・ウィザードで Derby embedded が使用されると、このような依存関係を持つプランが作成されます。解決策は、生成されたプランをカット・アンド・ペーストして、アプリケーション・アーカイブの一部としてデプロイすることです。こうすると、データベース・プールは Customer Service ユーティリティーにのみ固有のものになります。この場合、既存の記述子プランには修正が必要です。リスト 11 以降のリストに、これらの変更を抜粋します。

リスト 11. 修正後の CustomerServicePool-alt.xml
<dep:moduleId>
    <dep:groupId>default</dep:groupId>
    <dep:artifactId>CustomerServicePool</dep:artifactId>
    <dep:version>1.0</dep:version>
    <dep:type>rar</dep:type>
</dep:moduleId>

生成されたプランは、データベース・プール・ウィザードから取得したものです。Step 4: Test Connection ページで、Deploy の代わりに Show Plan ボタンをクリックしてください。生成されたプランをカット・アンド・ペーストして別のファイル (CustomerServicePool-alt.xml など) に保管した後、<groupId> タグをリスト 11 のコンテンツと一致するように修正します。これは、CustomerServicePool を今度はアプリケーションの一部としてデプロイするためです。つまり、この <groupId> タグは、geronimo-application.xml の <groupId> タグと一致することになります。リスト 12 に geronimo-application.xml の一部を表示します。

リスト 12. 代わりの geronimo-application.xml
<module>
    <connector>tranql-connector-1.2.rar</connector>
    <alt-dd>CustomerServicePool-alt.xml</alt-dd>
</module>

geronimo-application.xml 記述子には、リスト 12 のタグを追加する必要があります。これは、リスト 13 に示す標準 application.xml についても同じことです。

リスト 13. 代わりの application.xml
<module>
    <connector>tranql-connector-1.2.rar</connector>
</module>

この追加タグは、代わりのデプロイメント用の application.xml でも必要です。リスト 14 に、記述子 CustomerEJB-openejb.xml に必要なコードの変更を示します。

リスト 14. 変更後の CustomerEJB-openejb.xml
<dep:dependencies/>

CustomerServicePool の既存の <dependencies> タグは、リスト 14 に示したコードと置き換えることができます。

最後に、tranql ドライバーと修正したデータベース・プール・プランを、アプリケーション・アーカイブ (.ear ファイル) 内の JAR ファイルと WAR ファイルと同じレベルにバンドルする必要があります。tranql ドライバーは Geronimo にバンドルされており、リポジトリー・フォルダー C にあります。


まとめ

連載第 1 回目の記事を読んで、最も一般的な JNDI 接続の 1 つ、EJB からのデータベース・プール・アクセスについて理解できたことを願います。この記事では、Geronimo コンソールを使用してデータベースを初期化し、データベース接続プールを構成する方法を説明しました。最後に Customer Service ユーティリティーで、この接続プールにコード内からアクセスする方法を披露しました。次回は JMS リソースへの JNDI 接続を取り上げ、これを使ってサンプル・アプリケーションを拡張する方法を紹介します。次の記事もお見逃しなく。


ダウンロード

内容ファイル名サイズ
Part 1 source codeCustomerService-part1.zip57KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology, WebSphere
ArticleID=232572
ArticleTitle=Apache Geronimo の JNDI ネーミングおよび Java リソース接続プール: 第 1 回 データ・ソース接続
publish-date=11212006