■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年02月08日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.139

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


さて、Tomcatなどの主要なWebコンテナーは、データベース接続のプールを行う
機能を持っているため、Axisを使ったWebサービスのプログラムでもこの機能
を利用することができます。


今回は、この接続プール(connection pool)の使い方を説明します。


まず、この接続プールを使うためには以下の作業項目が必要になります。
(ここでは、データベースはJNDIリソースとして扱われますが、このJNDI
が何であるのか、については、ずっと後で、EJBの説明をするときに一緒に
説明いたします。ここでは、インターネット上にある様々なリソース(資源)
の登録簿のようなものを調べてリソースにアクセスするためのAPIだという
程度に頭に入れておいて下さい。)


(1) TomcatへJDBCドライバーをインストールする。

これは既にvol.101でTomcatのlibディレクトリー(C:\Tomcat6.0\lib)にMySQL
のJDBCドライバーのJARファイルをコピーしてありますので、済んでいます。


(2) Webアプリケーション・デプロイメント記述子(web.xml)を修正する。

web.xmlに、アプリケーションが参照するJNDIリソースを記述します。
web.xmlファイルのweb-appタグの下に下記のような内容を追加して下さい。
(web.xmlファイルの所在地は、
C:\Tomcat6.0\webapps\axis\WEB-INF\web.xml
です。)

--------------------------------------------------------
<resource-ref>
  <description>
    適当に説明書きをする。
  </description>
  <res-ref-name>
    jdbc/HOTELDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>
--------------------------------------------------------

ここでres-ref-name(リソース参照名)にはjdbc/HOTELDBというのを指定していま
すが、これはデータベースの名前というわけではありません。ここには、下の(3)
のserver.xmlで設定するリソース名(resource name)を指定する必要があります。
けれどもこのリソース名には、jdbc/HOTELDBのようにデータベース名を含めた名前
にしておいたほうが分かりやすくていいのです。
またres-type(リソースの型)に指定したjavax.sql.DataSourceは、データ資源を
表現するオブジェクト(実際はinterface)ですが、これは決まり文句だと思って
ください。このDataSourceを使うことによって、接続プールを利用することが
できます。
res-authにContainerを指定しているのは、このjdbc/HOTELDBに接続を行うのが
Webコンテナーであることを意味するものです。(正確に言うと、このJNDIリソー
スにサインオン(signon)するのはWebアプリケーション(Servlet)ではなく、
コンテナーであるということを指定するもの。)


(3) Tomcatにリソース・ファクトリーを設定する。

ファクトリー(factory=工場)はオブジェクトを生成するオブジェクトを意味
します。物を製造する工場への比喩から来ています。(ファクトリーの詳細に
ついては、ずっと後でデザイン・パターンの話をするときに説明します。)
リソース・ファクトリーというのは、リソース(resource=資源)を製造する
工場の如く、リソースを表現するオブジェクト(ここではDataSource型のオブ
ジェクト)を生成するオブジェクトを意味します。
ここでは、データベースを表現するオブジェクト(DataSource型)を生成する
リソース・ファクトリーを設定します。
Tomcatは、下記のような設定を行うと、リソース・ファクトリーを作ってくれ
ます。
server.xmlファイルのHostタグの下に下記のような内容を追加します。
(Hostタグは、

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

というふうになっているはずです。その下に下記のような内容を追加して下さい。)
(server.xmlファイルの所在地は、
C:\Tomcat6.0\conf\server.xml
です。)

--------------------------------------------------------
<Context path="/axis" reloadable="true">
  <Resource name="jdbc/HOTELDB" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/HOTELDB"
    username="root"
    password="rootpass"
    maxActive="10"
    maxIdle="30"
    maxWait="10000"
    defaultAutoCommit="false" />
</Context>
--------------------------------------------------------

ここで、
Resourceタグのname属性が、(2)でお話したリソース名を指定するもので
あることは既にお分かりのことと思います。
また、auth属性やtype属性も、それぞれ(2)のres-authやres-typeと一致
していることがわかりますね。
その他の属性は、
driverClassNameは、JDBCドライバーの完全修飾Javaクラス名、
urlはJDBCドライバーに渡されるJDBC URL、
usernameは、JDBCドライバーに渡されるデータベースのユーザー名、
passwordは、JDBCドライバーに渡されるデータベースのパスワード、
maxActiveは、プール内のデータベース接続の最大数(0を設定すると
無制限になる。)、
maxIdleは、プール内で同時にアイドルにしておける接続の最大数
(0を設定すると無制限になる。)、
maxWaitは、データベース接続が利用可能になるまでの最大待ち時間(ミリ秒単位)
(この時間を超過すると例外が投げられる。-1を設定すると無限に待つ。)
を指定します。
ここで、urlに指定したデータベースの名前は、前回作成したデータベース
(HOTELDB)であることは分かりますね。
こうして、データベースHOTELDBがリソース名jdbc/HOTELDBに結び付けられる
わけです。


(4) このリソースを使うコードをアプリケーションに記述する。

大まかには、下記のようなコーディングを行うことになりますが、実際の
コーディングは次回行います。

--------------------------------------------------------
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/HOTELDB");
if (ds != null) {
   Connection conn = ds.getConnection();
   if(conn != null)  {
      //...
      //...ここでデータアクセスを行う。
      //...
      conn.close();
   }
}
--------------------------------------------------------

ここで、jdbc/HOTELDBは、web.xmlで指定したリソース参照名です。一方、
java:comp/env/jdbc/HOTELDBは、JNDIのENC(environment naming context)名
と呼ばれる命名法でリソースを参照する名前で、今のところはリソース参照名の
先頭にjava:comp/env/を付けるとだけ頭に入れておけばいいです。(詳しいこと
は、EJBの説明をするときにまとめてお話します。)

また、これまでのデータベース接続と違って、DriverManagerのgetConnection()メ
ソッド(vol.023参照)ではなく、ds(DataSource型)のgetConnection()メソッド
を使っていることに注意してください。
DataSourceのgetConnection()メソッドを使うことによって、接続プールから
既存の接続を取り出す(既存のものがない場合は、その場で新しく接続を行う)
ことができます。DriverManagerを使用する方法では接続プールは使えないのです。



では、これからプログラミングに入っていきたいのですが、実際にプログラム
を作ってテストするためには、データベースにテスト用データが入っていなけ
ればなりませんので、こちらを先にやっておきましょう。



ここでは、Eclipseでデータベースにデータを入力することにし、そのために
DBViewerを使うことにします。
というわけで、DBViewerにデータベースHOTELDBを登録し、アクセスできる
ようにしましょう。
基本的にはvol.083,vol.084と同様の作業になりますが、下に再度手順を書い
ておきます。(必要な人は、vol.083,vol.084も参照して下さい。)

では、まず、Eclipseを起動しておいて下さい。

(1) Eclipseのメニュー・バーから「ウインドウ」→「パースペクティブを開く」
→「その他」を選択します。

(2) 「DBViewer」を選択し、「OK」ボタンをクリックします。

これで、DBViewerのパースペクティブが開きました。

(3) 左上のほうにある「DBツリー・ビュー」の中の「DBViewerPlugin」を
右クリックし、「登録」を選択します。

(4) 「データベース定義名」欄にデータベース名

HOTELDB

を入力します。

(5) 「JDBC Driver」欄の下の「ファイルの追加」ボタンをクリックし、

C:\MySQL_Driver

の中の

mysql-connector-java-5.0.8-bin.jar

を指定して、「開く」ボタンをクリックし、「次へ」ボタンをクリック
します。

(6) 「テンプレートに登録されている接続文字列に置き換えますか?」と
聞いてきたら、「キャンセル」ボタンをクリックします。

(7) 「JDBC Driver」に「com.mysql.jdbc.Driver」が選択されていることを
確認し、「JDBCタイプ」は「Type4」を選択します。
「接続文字列」には、

jdbc:mysql://127.0.0.1:3306/HOTELDB

を入力します。(これは、JDBC URLです。)

「接続ユーザ」には

root

を入力し、「接続パスワード」には、

rootpass

を入力します。

(8) 念のために「テスト接続」のボタンをクリックしてみましょう。上のほう
の「接続情報の設定」というタイトル文の下に「接続に成功しました」という
メッセージが出ればO.K.です。
「次へ」ボタンをクリックしてください。

(9) 「Charsetの設定(有効なデータベースのみ)」欄に

sjis

を入力し、(「SJIS<=>Unicode変換の設定」欄はチェックマークが入った
そのままの状態にして)「終了」ボタンをクリックしてください。


では、データベースHOTELDBに接続してみましょう。
「DBツリー・ビュー」の中のDBViewerPluginの配下にあるHOTELDBを右クリックし、
「接続」を選択します。

データベースに接続されると、TABLEという項目(フォルダ)が表示され、
その左側の+マークをクリックすると、データベースの中にはいっている
テーブルがリストされますね。


では、今回はここまでとし、HOTELDBを切断しておきましょう。
「DBツリー・ビュー」の中のHOTELDBを右クリックし、「切断」を選択して
ください。


とりあえず、パースペクティブはJavaに戻しておいてから、Eclipseを終了
しましょう。



(次回に続く)


では、今日はここまでにします。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製