2009-8-26作成

 ■H2 DB JDBC接続

 ここでは H2 DB をJavaから、JDBC(Java DataBase Connectivity)を通して使用するための設定について説明します。

 なおここではサーバーJavaの実行環境としてTOMCATを前提にしています。そのため実質的にはH2 DBの設定というより、TOMCATの設定の話になります。その点をご了承ください。

 ■JDBC接続

 ◇JDBCドライバ

 「H2 DB 他アプリからの利用(JDBC)」でも説明していますが、JDBCドライバは必要ありません。正確には別に用意する必要はない、ということです。

 H2 DBインストールディレクトリ\binに、h2-バージョン番号.jar(例えばVer1.1.117ならh2-1.1.117.jar)というH2 DB本体のファイルがあります。これにJDBCドライバも含まれているからです。このファイルをTOMCAT5.5以前なら %CATALINA_HOME%\common\lib 、TOMCAT6なら %CATALINA_HOME%\lib にコピーします。

 ◇JDBC接続パラメータ

 接続パラメータはJavaソース上に直接記述してもいいんですが、ここはコンテキストパラメータの設定コンフィグパラメータの設定で説明した、TOMCATに設定する初期化パラメータを使いましょう。

 以下の説明ではコンテキストパラメータを使いますが、コンフィグパラメータでも同じことです。

 必要なパラメータは、JDBCドライバ名、DBサーバーの指定、DBのユーザーID、DBパスワード、です。実際のパラメータ名は各自の環境で作ればいいんですが、例をあげておきます。

web.xmlの設定例

<?xml version="1.0" encoding="Windows-31J"?>

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

<web-app>

<!-- JDBCに関するパラメータ設定 (H2 DB) -->
  <context-param>
    <param-name>jdbcDriver</param-name>
    <param-value>org.h2.Driver</param-value>
    <description>JDBC Driver</description>
  </context-param>

  <context-param>
    <param-name>jdbcUri</param-name>
    <param-value>jdbc:h2:tcp://localhost/~\My Documents\H2_data\testdb>
    <description>MySQL URI</description>
  </context-param>

  <context-param>
    <param-name>dbUser</param-name>
    <param-value>sa</param-value>
    <description>H2 DB USER</description>
  </context-param>

  <context-param>
    <param-name>dbPassword</param-name>
    <param-value></param-value>
    <description>H2 DB PASSWORD</description>
  </context-param>
<!-- ここまで -->


  <servlet>
    <servlet-name>
      サーブレット名
    </servlet-name>
    <servlet-class>
      パッケージ名.サーブレット名
    </servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>invoker</servlet-name>
    <url-pattern>/servlet/*</url-pattern>
  </servlet-mapping>

</web-app>

 この中でパラメータ名jdbcDriverに対する値設定は、この例のままでいいです。

 パラメータ名dbUserとdbPasswordに対する値は、各自が使うDBのユーザー設定に合わせてください。この例ではデフォルトインストールのままで特にユーザーの作成も何もしていない状態、標準で定義されている管理者ユーザー sa でパスワード無しで接続するためのものです。

 パラメータ名jdbcUriで指定しているのが、接続するDBサーバーに関する情報です。値の中で jdbc:h2:tcp: まではこのままでいいです。これはH2 DBがサーバーモードで動いており、そこに接続するための指定です。

 このtcpの部分をfileに変えて jdbc:h2:file: にすると、今度は組込モードでH2 DBデータベースにアクセスします。組込モードについては「組込モードでのJDBC利用」にまとめてあるので、そちらを参照してください。

 次の//以降は各環境によって変わります。//直後に指定するのがDBサーバーの指定で、ホスト名やIPアドレスで指定します。例ではここが localhost となっていますが、TOMCATとH2 DBが同じマシンで動いている場合です。TOMCATを動かしているAPサーバーとDBサーバーが別のマシンである場合、IPアドレスやホスト名でDBサーバーを指定してください。  最後の : の後ろが、接続先のDB名になります。

 この例ではWindowsログインユーザーのHOMEディレクトリ\My DocumentsにH2_dataディレクトリを作成し、その下にあるtestdbデータベースに接続しています。

 他の指定パターンについては「H2 DBデータベースファイルの場所」や、「組込モード時のデータベースファイルの場所」を参考にしてください。

 ◇JDBC接続のサンプル

 例としてテーブル一覧を表示するサーブレットを載せておきます。使用するDBユーザーIDが、H2 DBのinforation_schema.tablesへのアクセス権限を持っていることが前提になります。

テーブル一覧表示のJava例(DB_List.java)

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class DB_List extends HttpServlet
  {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
      {
        request.setCharacterEncoding("Shift_JIS");
        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<meta http-equiv=\"pragma\" content=\"no-cache\"/>");
        out.println("<title>DBのテスト</title>");
        out.println("</head>");

        out.println("<body bgcolor=\"skyblue\">");
        out.println("<font size=5>");

        // Web.xmlからcontextを取得
        ServletContext w_SrvCont = getServletContext();

        String jdbcdriver = w_SrvCont.getInitParameter("jdbcDriver");

        try
          {
            Class.forName(jdbcdriver);

            String dbURI = w_SrvCont.getInitParameter("jdbcUri");
            String dbUID  = w_SrvCont.getInitParameter("dbUser");
            String dbPWD = w_SrvCont.getInitParameter("dbPassword");

            Connection dbcnn = DriverManager.getConnection(dbURI, dbUID, dbPWD);

            Statement stmt = dbcnn.createStatement();

            ResultSet rs  = stmt.executeQuery("select table_schema, table_name"
                                            + " from information_schema.tables"
                                            + " where table_type = 'TABLE'");
            out.println("<table border='1'>");
            out.println("<tr><th>スキーマ名</th><th>テーブル名</th></tr>");
            while(rs.next())
              {
                out.println("<tr>");
                out.println("<td>" + rs.getString(1) + "</td>"
                          + "<td>" + rs.getString(2) + "</td>");
                out.println("</tr>");
              }
            out.println("</table>");

            rs.close();
            stmt.close();
            dbcnn.close();
          }
        catch(ClassNotFoundException wl_excp)
          {
            out.println("ロードに失敗しました。・・・ <br />"
                      + wl_excp.getMessage() + "<br />");
          }
        catch(Exception wl_excp)
          {
            out.println("接続できませんでした・・・ <br />"
                      + wl_excp.getMessage() + "<br />");
          }
        out.println("</font>");
        out.println("</body>");
        out.println("</html>");

        out.close();
      }
  }



このページの先頭  技術メモ先頭  サーバーJava入門先頭  H2 DB Engine編先頭

Copyright © 2009 YOK. All Rights Reserved.