MASUDAQ Blog

NO DEVELOPMENT NO LIFE.

Apache Tomcat 6.0 の JNDI による DB アクセス

Apache Tomcat 6.0 の JNDI リソースを利用した DB アクセスの方法

Tomcat 6 では、J2EE の JDNI が利用できる。JNDI は、簡単に言えば分散オブジェクトの技術だが、JDBC データソース の管理にも利用できる。もちろん JNDI を利用することなく、JDBC を直接利用して、DB へアクセスしても構わないが、JNDI を利用することにより、コネクションプーリングや疎結合性による将来的なスケーラビリティの確保等の恩恵を受けることができる。

ただ、JNDI は、JDBC と対極する技術ではなく、JNDI は、下位で JDBC を利用している。JDBC を JNDI でラップすることにより、疎結合性を確保している。

まず、JDBC ドライバーを Tomcat にインストールする。$CATALINA_HOME/lib にJDBC ファイルをコピーする。筆者の環境では、以下のパスに JDBC ファイルを配置した。

C:\Program Files\apache-tomcat-6.0.24-windows-x64\apache-tomcat-6.0.24\lib

筆者は、主に MySQL を開発環境として利用している。ため、JDBC ドライバとして、 "mysql-connector-java-5.1.12-bin.jar" を上記のパスにコピーした。 MySQL の JDBC ドライバの入手は、以下の記事を参照のこと。

http://www.masudaq.com/blogger/Daily_2010_03_03.htm#70c4d074-9e8e-4ef6-b758-26882fdaf34e

次に JDBC ドライバーをリソースとして定義する。

WEB-INF/web.xml ファイルの <web-app> ノード下に以下のノードを追加する。"res-type", "res-type" 以外のテキストノードは、任意でよい。

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

server.xml にリソースの宣言をする。driverClassName は、利用対象の DB の JDBC ドライバークラスを指定する。筆者は、MySQL を利用するので、MySQL の JDBC ドライバーを指定した。url には、DB への接続文字列。筆者の環境では、ローカルに MySQL をインストールをしており、MySQL のデフォルトポート 3306 で通信できる。MySQL のインストール後に、デフォルトで作成される "test" データベースにアクセスする。アクセス時に利用する、ユーザー名、パスワードをそれぞれ、"username", "password" に設定する。

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000" name="jdbc/MySqlConnection" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test" username="root"  password="password"/>

以上だけで、設定は完了だ。サンプルコードを以下に記載する。

import javax.naming.*;
import javax.sql.*;
import java.sql.*;
...

Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/MySqlConnection");

Connection con = ds.getConnection();

String query = "select * from helloMySql";
Statement stm = con.createStatement();

ResultSet rs = stm.executeQuery(query);

String messages = "";

while (rs.next())
{
  int id = rs.getInt("id");
  String msg = rs.getString("message");
  messages += id + ": " + message + "\r\n";
}br />
stm.close();
con.close();

return mereturn messages;

このエントリーをはてなブックマークに追加