JBoss でのデータソースの定義のしかた (DB2/400)

JDBC でデータベースにアクセスすることはずいぶん一般的になったような気がします。
いろいろな雑誌や本を読むと、サーバーサイド Java に関する内容であれば触れられていない方がめずらしいというかんじです。

やはりごく初期のころに比較すると、いろいろな経験が蓄積されていわゆる一般的な書き方といったものも変わってきています。

その変わってきたものの中に、データソースの使用が挙げられます。

ごく最初の頃は JDBC ドライバーをレジスターして connection オブジェクトを作成して、という例が一般的だったのですが、やはり負荷のかかる処理であり、データソースを使用するとアプリケーションサーバー等の機能であらかじめ登録してあるものを再利用してよりサーバー資源を有効に利用できるようになるために、取って代わられるようになりました。

今回は JBoss 3.2.x でのデータソースの定義のしかたと簡単なコーディングのしかたを DB2/400 での設定を例に取って紹介してみてます。


実際にアクセスを行う JDBC ドライバーの定義

定義ファイルの作成

os400db2-ds.xml という名前で以下のようなファイルを作成し、サーバーの deploy ディレクトリにコピーします。
名前は別にこの名前でなくてもかまいませんが、以下のような XML ファイルのフォーマットでJDBC ドライバーのクラス、URL、ユーザー/パスワードなどを指定してある必要があります。

この中の <jndi-name> に指定した名前がまずサーバー上で JNDI 名になります。

getDataSource メソッドを使用して、データソースオブジェクトを取得する際は JNDI 名を指定しますが、ここで指定した名前をそのまま使用することもできます。
後述しますが、通常はさらに設定を行って JNDI 名のマッピングを行います。

<?xml version="1.0" encoding="UTF-8"?>

<!-- ===================================================================== -->
<!--                                                                       -->
<!--  JBoss Server Configuration                                           -->
<!--                                                                       -->
<!-- ===================================================================== -->

<!-- $Id: db2-ds.xml,v 1.1 2002/07/22 22:57:24 d_jencks Exp $ -->

<datasources>
  <local-tx-datasource>
    <jndi-name>jt400</jndi-name>
    <connection-url>jdbc:as400://domino400</connection-url>
    <driver-class>com.ibm.as400.access.AS400JDBCDriver</driver-class>
    <user-name>JDBCUSER</user-name>
    <password>PWD400</password>
    <min-pool-size>5</min-pool-size>
  </local-tx-datasource>

</datasources>

JDBC ドライバークラスのコピー

あわせて、指定した JDBC ドライバーのクラスにアクセスできるようにクラスパスをサーバーの lib ディレクトリに通すか、JAR ファイルそのものをコピーするのを忘れないでください。
今回は JTOpen の JAR ファイルである jt400.jar をコピーしました。

定義ファイルのデプロイ

上記の定義をコピーするとすぐにデプロイが始まります。

最後の方に JNDI 名が "java:/jt400" になった旨のメッセージがあがっているのが確認できますね。
この名前で lookup を行うことができます。

データソースを使用したコーディング

実際の使用方法ですが、順番としてはまず最初に InitialContext オブジェクトを作成します。
そしてその InitialContext オブジェクトに対して JNDI 名で lookup メソッドを実行し、戻されたオブジェクトを DataSource オブジェクトにキャストして、データソースオブジェクトを取得します。

InitialContext ctx = new InitialContext();
return (DataSource) ctx.lookup("java:/jt400");

実際に使用する時は、たとえば以下のように getDataSource みたいなメソッドを用意しておくのがいいでしょう。

        private DataSource getDataSource() throws ServletException
        {
        try {
                InitialContext ctx = new InitialContext();
                System.out.println("get InitialContext");
                return (DataSource) ctx.lookup("java:/jt400");
        }
        catch (NamingException ne) {
                throw new ServletException("Naming lookup failure: " + ne.getMessage());
        }
        } 

取得したデータソースから connection オブジェクトを作成します。
その後は通常の JDBC のコーディングとほぼ同様です。

        try {           
                DataSource ds = getDataSource();                
                Connection connection = ds.getConnection();

Web アプリケーションでの JNDI 名の使用とそのための設定

上に紹介したような方法では、環境によってデータソースの JNDI 名が決まり、それにあわせてデータソースの取得を行うコーディングをするような格好になってしまいます。
つまりサーバーの実行環境によってデーターソース名が異なることがあり得る以上、その場合はあわせてクラスの内容を変えなくてはいけないことになってしまいますね。アプリケーションの可搬性に問題がでてしまいます。

実際を考えると、Web アプリケーションによってアクセスするための名前は違うことが予想され、なおかつそれはサーバー側の使用するデータベースやユーザーなどによるデータソースの指定と、アプリケーション実行環境によって適切なマッピングできる必要があります。

そこでアプリケーション側でのある程度の標準化と、サーバープラットフォーム固有での、アプリケーションが期待する JNDI 名とサーバー側で定義されたデータ取得元 (まさしく"データソース"ですね) とのマッピングメカニズムが存在します。

アプリケーション側でのお作法

コーディング

データソースであれば、"java:comp/env/jdbc/データソース名"でアクセスするのが一般的なので、実際には以下のようなコードになるでしょう。

return (DataSource) ctx.lookup("java:comp/env/jdbc/jt400");

"java:comp/env/jdbc/..."でアクセスするためには、データソースの定義ファイルだけではなく、web.xml への変更と jboss-web.xml というファイルが追加で必要になります。

web.xml

web.xml の方ではこういうサーブレットがあって、それがこういう JNDI名で、DataSource 型のオブジェクトを使用しています、という宣言というかお知らせを <resource-ref> で定義します。

web.xml のサンプルはこんなかんじです。

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC
   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <description>The standard web descriptor for the html adaptor</description>
  <servlet>
    <servlet-name>TestHTML</servlet-name>
    <servlet-class>TestHTMLTableServletDS</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>TestHTML</servlet-name>
    <url-pattern>/Test</url-pattern>
  </servlet-mapping>

  <resource-ref>
    <description>JDBC DataSource</description>
    <res-ref-name>jdbc/jt400</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

</web-app>

プラットフォーム固有の定義

web.xml での宣言とサーバーのデータソース定義とのマッピング (jboss-web.xml)

データソースの定義だけですと先に見たように java:/jt400 になってしまっているので、この名前と web.xml で指定している「こう読み込みたい」名前である "jdbc/jt400" (実際には java:comp/env/jdbc/jt400) とのマッピングを行う必要がありますね。
これを実現するのが jboss-web.xml というファイルです。

先の web.xml とワンセットで WAR ファイルの WEB-INF の下に置きます。

web.xml の <res-ref-name> で定義した名前を <resource-ref> セクションの <res-ref-name> に設定し、データソースの定義が実際にセットしている参照名を <jndi-name> に設定します。

jboss-web.xml

<jboss-web>

   <resource-ref>
       <res-ref-name>jdbc/jt400</res-ref-name>
       <jndi-name>java:/jt400</jndi-name>
   </resource-ref>

</jboss-web>

web.xml で使用している JNDI名の設定を見て、jboss-web.xml で実際のデータソース名とその設定との違いを吸収する、といったかたちになっています。
ここで「実際のデータソース名」というのは JBoss 上での設定で、JBoss 上ではひとつのデータソース接続の設定に複数の Web アプリケーションの JNDI 名を WAR 毎に異なったものでも設定できる、ということになります。

[Top Pageに戻る]

[PR] | ハウスクリーニング葬儀 東京韓国食材転職サイトSEOアクセス解析ハウスメーカーレンタルオフィスSEO対策消費者金融不動産担保ローン時計車 買取ハワイ挙式アスクル転職生命保険テンプレート沖縄旅行動画免許合宿二輪引越し消費者金融税理士ゴルフ会員権留学レーシックマッサージFX投資信託くりっく365アフィリエイト育毛剤FXホームページ制作デイトレードFXホノルルマラソンベスト ハワイ ホテル レーツバリ島ハワイウエディングHawaii hotelsHawaii Activitiesbhhr
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ.ビジネスクラス ハワイ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行
無料ホームページ作成 - レンタルサーバー - 携帯ホームページ - ブログ - ホテル 予約 - タイムシェア - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - ハワイ 不動産 - プーケット ホテル
[PR] 事故車の処分にお困りならこちら!事故車でも売れるんです