@634

JNDIとデータソース(javax.sql.DataSource)の利用

Advertisement

JNDIとデータソース

J2EEの環境でデータベース接続を行う際にはデータソース(javax.sql.DataSource)の利用が推奨されている。データソースを利用するためにはJNDI(Java Naming and Directory Interface)を使う。

JNDIでは名前からオブジェクトを検索して取得する。データソースやEJBの取得に利用されることが多い。他のいろいろな機能については省略。

データベース接続にJNDIとデータソースを利用する理由

アプリケーションの開発環境と実行環境で接続するデータベースが異なる場合、データソースを利用しないプログラムでは、動かす環境ごとにプログラムで指定しているドライバ名やサービス名などの接続文字列を変更しなければならない。

// 開発用
DriverManager.getConnection("jdbc:odbc:DevDB" ,"dev01" ,"dev01pass")
// 本番用
//DriverManager.getConnection("jdbc:odbc:MasterDB" ,"user01" ,"user01pass")
この問題について対処法を考えてみる。

対処法1:まとめる
データベース接続用クラスを作り、データベースへの接続を一元管理する。接続文字列の変更が一箇所で行えるようになる。接続先が変更になるとソースコードを変更しなければならないので、再コンパイルしなければならない。

対処法2:外部変数
某社のシステムでは最コンパイルを避けるために、propertyファイルから接続文字列、ユーザー名、パスワードを取得する仕組みになっていた。この場合、ソースコードの変更は必要ないが環境を変えるときにプロパティファイルの内容を変更する必要がある。

前述の通り、JNDIでは名前からオブジェクトを取得する。開発環境ではjava:comp/env/jdbc/datasourceという名前でコネクションオブジェクトを要求すると開発用データベースへの接続オブジェクトを取得することができ、本番環境で同じjava:comp/env/jdbc/datasourceという名前でオブジェクトの要求を行うと本番環境への接続オブジェクトを取得することができる。再コンパイルも外部変数の変更も必要なく、異なるデータベースへ接続することができる。

データソースの取得

データソースをJNDIに登録する方法はアプリケーションサーバーによって異なるため、環境によってマニュアルを参照すること。ただし、どの環境でもJNDIからの検索方法は同じ。

ここでは例としてTomcatでの利用方法を掲載する。

Tomcatでは、データソースはservet.xmlというサーバー設定ファイルに定義する。
server.xml
<Context path="/SampleProject" reloadable="true"
         docBase="C:\workspace\SampleProject">

  <Resource name="jdbc/datasource" auth="Container"
            type="javax.sql.DataSource" />
  <ResourceParams name="jdbc/datasource">
    <parameter>
      <name>username</name>
      <value>user01</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>user01pass</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>oracle.jdbc.driver.OracleDriver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:oracle:thin:@localhost:1521:sample</value>
    </parameter>
  </ResourceParams>
</Context>
DriveManagerを利用する場合とほぼ同一の情報(データベース接続文字列・ユーザー名・パスワード・ドライバ名)を定義している(パラメータは他にもいろいろあります)。
次はプログラム側でデータソースを利用する。

インポート
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

データソースの検索
try{
  // データソースの取得
  Context context = new InitialContext();
  DataSource dataSource =
    (DataSource)context.lookup("java:comp/env/jdbc/datasource");

  //コネクションの取得
  Connection con = dataSource.getConnection();
}catch(NamingException e){

}

lookupメソッドでJNDIへの問い合わせを実行している。
引数は以下のルールに従う。
java:comp/env/(server.xmlに指定したリソース名)

Advertisement

V[gJbg

E634
EJeSgbvy[W
E634labs
   UIRNVM[

TCg

Google

Web TCg

Y!O[