JNDI活用でデータソース管理を一元化するJavaTips 〜アプリケーションサーバ/コンテナ活用編

» 2003年10月07日 10時00分 公開
[山田祥寛@IT]

 データベースの接続情報は、開発環境から実行環境への移行や、アプリケーションをパッケージとして配布する際に変更する必要があります。この情報は大概「.jsp」ファイルや「.java」ファイルに分散して記述されており、実行環境への移行やパッケージとしての配布の際に、修正漏れや間違いを引き起こしやすい要因といえるでしょう。

 この問題を解決する方法の1つに、JNDI(Java Naming and Directory Interface)を使って環境に依存する(かつアプリケーション内で共通して使用する)情報をアプリケーション上で一元的に管理するというテクニックがあります。JNDIを採用することで、個々の「.jsp」「.java」ファイルにいちいち接続情報を記述する必要はなくなりますし、接続先のデータベースに変更があった場合にも容易に変更が可能となります。もちろん、「.java」ファイルのコンパイルなども不要になります。

操作手順

(1)server.xmlを編集する

 Tomcatのサーバ設定ファイルserver.xmlは、Tomcatインストールフォルダ配下の「conf」フォルダに含まれています。

 server.xmlをテキストエディタなどで開き、以下のように追加してください。赤字部分が追記するコードです。アプリケーションパス、アプリケーション名は、共に「javatips」とします。

<!-- Tomcat Root Context -->
<!--
  <Context path="" docBase="ROOT" debug="0"/>
-->
<Context path="/javatips" docBase="javatips" debug="0"
         reloadable="false" crossContext="true">
  <Resource name="jdbc/TestDB" auth="container"
            type="javax.sql.DataSource" debug="1" />
  <ResourceParams name="jdbc/TestDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    <parameter>
       <name>driverClassName</name>
       <value>org.gjt.mm.mysql.Driver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost/jsp?user=jsp&amp;password=
jsp&amp;useUnicode=true&amp;characterEncoding=Shift_JIS</value>
    </parameter>
  </ResourceParams>
</Context>


 データベースへの接続設定は、アプリケーション(コンテキスト)単位で<Context>要素に記述します。データベースリソースの概要情報(外部リソース名やリソースの種類など)は<Resource>要素に、リソースに渡すパラメータ情報は<ResourceParams>要素に記述します。

 <ResourceParams>要素に設定可能な主要なパラメータは以下のとおりです。

パラメータ名 概要
factory データソース管理に使用するクラスの完全修飾名
maxActive データベースへの最大接続数(0のときは無制限)
maxIdle コネクションプールに保持する最大接続数(0のときは無制限)
maxWait 接続時のタイムアウト時間(ミリ秒。0のときは無制限)
usename 接続時に使用するユーザ名(接続文字列に含めても可)
password 接続時に使用するパスワード(接続文字列に含めても可)
C データベース接続用のJDBCドライバ(完全修飾名)
url データベース接続文字列

 factory、driverClassName、urlパラメータは必須指定です。なお、接続文字列に「&」が含まれている場合、必ず「&amp;」のようにエスケープする必要がありますので、注意してください。

(2)web.xmlを編集する

 server.xmlで設定したデータソースをアプリケーション上で有効にするには、アプリケーション単位にweb.xml(例えば、「/webapps/javatips/WEB-INF/web.xml」)を設定する必要があります。

 web.xmlをテキストエディタなどで開き、以下の内容を追加してください。web.xml上では要素の記述順も厳密に定められていますので、自分の環境に応じて、適切な個所に記述を追加してください。

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>


 <resource-ref>要素配下の子要素の意味は、それぞれ以下のとおりです。

要素名 概要
<description> 外部リソースの説明(任意)
<res-ref-name> 外部リソースの参照名(server.xmlの<Resource>要素に対応。自由に設定することができます)
<res-type> リソースのデータ型
<res-auth> リソースの制御(Container|Servlet)

 <res-type>、<res-auth>要素は、ここでは固定値と思っておいて問題ないでしょう。なお、server.xml、web.xmlを編集した後は、必ずTomcatの再起動を忘れないようにしてください。ここまででデータソースの設定は完了です。

(3)データソースに接続する「.jsp」ファイルを記述する

 それでは、いよいよ「.jsp」ファイルを設置して、データソースに対して接続ができることを確認してみることにしましょう。

 テキストエディタで新規文書を作成し、以下の「.jsp」ファイルを作成してみてください。

<%@ page contentType="text/html;charset=Shift_JIS"
         import="javax.sql.*,javax.naming.*,java.sql.*" %>
<%
Context objCtx=new InitialContext();
DataSource objDs
=(DataSource)objCtx.lookup("java:comp/env/jdbc/TestDB");
Connection db=objDs.getConnection();
Statement objSql=db.createStatement();
  ...中略...
db.close();
%>


 任意のファイル名で保存した「.jsp」ファイルに対して、ブラウザから問題なくアクセスできれば成功です。

 Context#lookupは、登録された外部リソースを検出するためのメソッドで「java:comp/env/外部リソース名」の形式で指定します。lookupメソッドの戻り値はObjectオブジェクトですので、使用に際しては必ず「型のキャスト」を行うのを忘れないようにしてください。

 取得したDataSourceオブジェクトのgetConnectionメソッドでConnectionオブジェクトを取得してしまえば、あとは通常のデータベース手続きとまったく同様です。データソースを再びコネクションプールに戻すために、closeメソッドは絶対に忘れないようにしてください(さもないと、使用中のデータソースが累積し、後続のリクエストがエラーとなってしまいます)。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。