■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |