Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > オープンソース > Tomcat −8.JDBC接続
更新日:2006/4/9
Tomcat−8.JDBC接続
ここでは、TomcatからJDBCを使用してデータベースMySQLにアクセスする方法について解説します。MySQL以外(Oracle8i、PostgreSQL)のJDBC接続例がTomcatドキュメントにありますため、そちらもあわせて参照してください。

実行環境
・WindowsXP Home Edition
・Tomcat 5.0.18
・J2SDK 1.4.2_03
・MySQL 4.0.18
・MySQL Connector/J 3.0
概要
JDBCでデータベースに接続するにはいくつかの方法があります。ここでは、メンテナンス性、非データベース依存などの関係から現在最もよいとされているJNDIを利用した接続方法について解説します。JNDI(Java Naming and Directory Interface)とはNIS、ActiveDirectoryなどのディレクトリサービスを利用するためのJavaAPIです。ディレクトリサービス実行環境に依存せず、Javaアプリケーションからディレクトリサービスを利用することができます。現在ではディレクトリサービスだけでなく、Javaアプリケーションがデータベース、メールサーバなどのリソースを見つけるためのAPIとしても利用されます。

JNDIリソースとしてJDBCを設定することにより、JavaアプリからはJNDIリソースを指定することでJDBCを利用することができます。データベースが変更された場合でもJNDIリソースを変更するだけでJavaアプリに影響を与えることはありません。

具体的にはserver.xmlにJNDIリソースの設定、web.xmlにJNDIリソースを参照する設定、JavaアプリにJNDIリソースを呼び出すコードを記載することでJDBC接続を行います。server.xml、web.xmlの概要についてはJavaの道:Tomcat(プログラム実行・配置)を参照してください。
TomcatのJDBC接続
MySQLの設定
Javaアプリからアクセスされるため、MySQLインストール、MySQLユーザの作成、データベースの作成、テーブルの作成、データのテーブルへの挿入をMySQLに対して行います。MySQLの設定方法についてはここでは省略します。以下のURLを参照するなどしてMySQLの設定を行ってください。

MySQL日本語ドキュメント:http://www.mysql.com/doc/ja/index.html
@IT:快速MySQLでデータベースアプリ!
【MySQL基本設定値】
設定項目
設定値
データベース名
auth
ユーザID
myuser
パスワード
mypass
テーブル名
city
【cityテーブルスキーマ】
カラム名
データ型
country
varchar(20)
capital
varchar(20)
【cityテーブル挿入データ】
country
capital
Japan
Tokyo
USA
NewYork
JDBCの設定
MySQLのJDBCライブラリとして「MySQL Connector/J」という製品を使用します。

1.ダウンロード
http://www.mysql.com/downloads/api-jdbc.htmlからConnector/JのProduction Releaseをダウンロードします。執筆時点の最新版はVer 3.0です。
MySQL Connector/Jのダウンロード
2.設置
ダウンロードしたファイル「mysql-connector-java-3.0.11-stable.zip」を解凍して、その中から「mysql-connector-java-3.0.11-stable-bin.jar」を$CATALINA_HOME\common\libディレクトリ配下に設置します。 これでJDBCの設定の終了です。
server.xmlの設定
server.xmlでJNDIリソースの設定を行います。JNDIリソースの設定には<Resource>タグと<ResourceParams>タグを使用します。<Resource>タグでJNDIリソースの指定を行い、<ResourceParams>タグで指定の際に使用するパラメータの設定を行います。<Resource>タグ、<ResourceParams>タグは<GlobalNamingResouces>タグ、<DefaultContext>タグ、<Context>タグのサブ要素として指定できます。
【<Resource>タグの属性】
要素
内容
デフォルト
必須
auth
リソースマネージャに接続する主体を指定する。Javaアプリが接続する場合は「Application」と、Javaアプリを代表してTomcatコンテナが接続する場合は「Container」と指定する。
-
-
description
<Resource>タグの説明を記載。
-
-
name
JNDIリソースの名前を指定。指定された名前はjava:comp/envの相対パスとして参照される。
-
scope
JNDIリソースとのコネクションが共有可能か指定する。「Shareable」もしくは、「Unshareable」を指定する。
Shareable
-
type
JNDIリソースのクラス型、インタフェース型を指定する。
-
【<ResourceParams>タグの属性】
要素
内容
デフォルト
必須
name
JNDIリソースの名前を指定。<Resource>タグのname属性の値と同一でなければならない。
-
<ResourceParams>タグには<parameter>タグでJNDIリソースの動作設定を行う必要があります。以下にJNDIリソースがJDBCである場合の主な設定項目を記載します。すべての設定項目はJavadocsのBasicDataSourceクラスを参照してください。
パラメータ名
内容
factory
JDBC接続のデータ管理に使用するJavaクラスを指定。値はorg.apache.commons.dbcp.BasicDataSourceFactoryになる。
maxActive
データベース接続の最大接続数を指定。0の場合は無制限になる。
maxIdle
アイドル状態になっている最大接続数を指定。0の場合は無制限になる。
maxWait
接続しているコネクションが再度利用されるまでの待ち時間を指定。指定した時間をすぎると例外が発生する。-1の場合は無制限になる。
username
データベースに接続するためのユーザIDを指定。
password
データベースに接続するためのパスワードを指定。
driverClassName
JDBCドライバのJavaクラスを指定。MySQL Connector/Jの場合は、org.gjt.mm.mysql.Driverになる。
url
JDBC接続のためのJDBC準拠のURLを指定。
<Resource>タグ、<ResourceParams>タグのserver.xmlへの設定を以下に記載します。<Host>タグのサブ要素として<DefaultContext>タグを追加し、そのサブ要素として両タグを設定します。
<Host name="localhost" debug="0" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">

  <!-- 1.DefaultContextタグの追加 -->
  <DefaultContext>

    <!-- 2.Resourceタグの追加 -->
    <Resource name="MySQL_JDBC" auth="Container" 
              type="javax.sql.DataSource"/>
    <!-- 3.ResourceParamsタグの追加 -->
    <ResourceParams name="MySQL_JDBC">

      <!-- 4.parameterタグの追加 -->
      <parameter>
        <name>factory</name>
        <value>
          org.apache.commons.dbcp.BasicDataSourceFactory
        </value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>20</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>30000</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>100</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>myuser</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>mypass</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>org.gjt.mm.mysql.Driver</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:mysql://localhost/auth</value>
      </parameter>
    </ResourceParams>
  </DefaultContext>
1. <Host>タグのサブ要素として<DefaultContext>タグを追加します。このタグで設定された要素はすべてのコンテキストに適用されます。
2. <Resource>タグを追加します。JNDIリソースは「MySQL_JDBC」という名前で参照され、リソースマネージャへの接続はTomcatコンテナが行い、JNDIリソースがJavaインタフェース型「javax.sql.DataSource」を返すことを表しています。
3. <ResourceParams>タグを追加します。name属性に「MySQL_JDBC」を設定し、上記の<Resource>タグに関連する設定であることを表しています。
4. <parameter>タグを使用し、JNDIリソースの動作設定を行います。<name>タグにパラメータ名、<value>タグにパラメータ名に対応する値を設定します。
web.xmlの設定
web.xmlでは<resource-ref>タグを使用してserver.xmlで設定したJNDIリソースを参照する設定を行います。これにより、JavaアプリからJNDIリソースが利用できるようになります。
【<resource-ref>タグのサブ要素】
要素
内容
デフォルト
必須
description
<resource-ref>タグの説明を記載。
- 0以上
res-ref-name
JNDIリソースの名前を指定。指定された名前はjava:comp/envの相対パスとして参照される。
- 必須
res-type
JNDIリソースのクラス型、インタフェース型を指定する。
- 必須
res-auth
リソースマネージャに接続する主体を指定する。Javaアプリが接続する場合は「Application」と、Javaアプリを代表してTomcatコンテナが接続する場合は「Container」と指定する。
- 必須
res-sharing-scope
JNDIリソースとのコネクションが共有可能か指定する。「Shareable」もしくは、「Unshareable」を指定する。
Shareable optional
web.xmlの設定を以下に記載します。

【web.xml】
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC 
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
  "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <resource-ref>
    <res-ref-name>MySQL_JDBC</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
1. <res-ref-name>タグに今回設定したJNDIリソース名である「MySQL_JDBC」を指定します。
2. <res-type>タグにJNDIリソースが返すデータ型である「javax.sql.DataSource」インタフェースを指定します。
3. <res-auth>タグにリソースマネージャの接続主体であるTomcatコンテナ「Container」を指定します。
Javaアプリの作成
JDBC接続の動作確認をするためにMySQLデータベースにアクセスし、データベース内のデータを表示するJSPプログラムを作成します。
【showTable.jsp】
<% page import="java.sql.*,
                javax.sql.*,
                javax.naming.InitialContext,
                javax.naming.Context" %>

<html>
<head><title>showTable.jsp</title></head>
<body>

<%
  InitialContext initCon = new InitialContext(); //(1)
  DataSource ds 
    = (DataSource)initCon.lookup("java:comp/env/MySQL_JDBC"); //(2)
  Connection con = ds.getConnection(); //(3)JNDIリソースへのコネクト
  Statement stmt = con.createStatement(); //(4)
  ResultSet result 
    = stmt.executeQuery("select * from city;"); //(5)SQL文の実行
%>

<table border="1">
  <tr>
    <th>Country</th>
    <th>Capital</th>
  </tr>

  //(6)データの表示
  <%
    while (result.next()) {
  %>

  <tr>
    <td> <%= result.getString(1) %></td>
    <td> <%= result.getString(2) %></td>
  </tr>

  <%
    }
    //(7)コネクトのクローズ
    con.close();
    initCon.close();
  %>
</table>

</body>
</html>
(1). JNDIリソースを見つけるネーミング操作のためのInitalContextオブジェクトinitConを生成します。
(2). lookupメソッドを使用し、JNDIリソースを見つけます。引数にはjava:comp/env/を相対パスとしたJNDIリソース名を指定します。
(3). JNDIリソースへコネクトを行います。
(4). SQL文をデータベースに送信するためのStatementオブジェクトstmtを生成します。
(5). 「select * from city;」を実行し、実行結果を変数resultに代入します。
(6). whileループを使用し、すべての実行結果を表示します。
(7). JNDIリソースへのコネクトをcloseします。
動作確認
JDBC接続の動作確認を行います。

1.ファイルの配置
これまで作成したファイルを該当箇所に配置します。server.xmlは$CATALINA_HOME\conf配下のserver.xmlを変更しているため、特にファイルの配置はありません。web.xml、showTable.jspは該当するコンテキストに配置します。コンテキストのディレクトリとして$CATALINA_HOME\webapps配下にJDBCTestディレクトリを作成します。その配下にweb.xml、showTable.jspを配置します。配置箇所は以下のようになります。
ファイルの配置
2.ファイルアクセス
MySQL、Tomcatを起動させhttp://localhost:8080/JDBCTest/showTable.jspにアクセスします。MySQLの格納データが表示されると正しくJDBC接続が行われています。
実行結果



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道