Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

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基本設定値

設定項目 設定値
データベース名 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://dev.mysql.com/downloads/connector/j/から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. (1)JNDIリソースを見つけるネーミング操作のためのInitalContextオブジェクトinitConを生成します。
  2. (2)lookupメソッドを使用し、JNDIリソースを見つけます。引数にはjava:comp/env/を相対パスとしたJNDIリソース名を指定します。
  3. (3)JNDIリソースへコネクトを行います。
  4. (4)SQL文をデータベースに送信するためのStatementオブジェクトstmtを生成します。
  5. (5)「select * from city;」を実行し、実行結果を変数resultに代入します。
  6. (6)whileループを使用し、すべての実行結果を表示します。
  7. (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接続が行われています。

    実行結果

10JDBC接続