IBM BluemixDevelop in the cloud at the click of a button!

Seasar2: 第 5 回 Seasar2 から DB2 を利用する

Seasar2 から DB2 を利用する

本連載では,軽量コンテナ Seasar2 を IBM WebSphere Application Server や IBM DB2 と連携させる方法について紹介します.連載の第 5 回目となるこの記事では,Seasar2 から WAS のコネクションプールを経由して DB2 を利用する方法を紹介します.

小林 浩一 (koichik@improvement.jp), Seasarプロジェクト コミッタ

メインフレームによるオンラインシステムから Java による Web アプリケーションまで,時代に流されぱなしで現在に至る.Seasar プロジェクトでは S2JMS や Kuina-Dao など,分散とトランザクションに関連したプロダクトを中心にコミッタを務めている.



2008年 6月 27日

コネクションプールとトランザクションマネージャ

Seasar2 は,コネクションプールおよび Java Transaction API の独自実装である,S2DBCP と S2JTA を提供しており,Tomcat 上で Seasar2 を利用する場合などに利用することができます.Seasar2 や関連プロダクトが提供する設定ファイルもS2DBCP と S2JTA を使う設定がデフォルトとして提供されています.

今回は,S2DBCP と S2JTA の代わりに,WebSphere Application Server (以下 WAS) が提供するコネクションプールとトランザクション機能を,Seasar2 から利用する方法について紹介します.

環境の準備

動作環境

今回作成するサンプルアプリケーションの動作環境を示します.

次のプラットフォームを使用します。

  • OS:Microsoft Windows XP Professional SP2
  • RDBMS:IBM DB2 Database V9.5
  • アプリケーションサーバー:IBM WebSphere Application Server Network Deployment V6.1.0.15
  • 統合開発環境:IBM WebSphere Application Server Toolkit (以下 AST) V6.1.1.6

AST については前回の記事を参考にしてください.

Seasar プロジェクトで開発されている次のプロダクトを使用します.

  • S2Container 2.4.25
  • S2-Tiger (S2JDBC を含む) 2.4.25
  • Super Agile Struts (以下 SAStruts) 1.0.2

SAMPLE データベースの準備

今回は,DB2 に含まれる SAMPLE データベースを使用します.SAMPLE データベースを使用するには,DB2 インストールディレクトリにある BIN\db2sample.exe を実行します.SAMPLE データベースに EMPLOYEE テーブルが作成されていることを確認してください.

図 1. SAMPLE データベースの EMPLOYEE テーブル
SAMPLE データベースの EMPLOYEE テーブル

WAS の設定

WAS の管理コンソールから,DB2 の SAMPLE スキーマに接続するためのデータソースを作成します.

JDBC プロバイダの作成

まず,DB2 に接続するための JDBC プロバイダを作成します.WASの管理コンソールで「リソース」-「JDBC」-「JDBCプロバイダー」を選んで「新規作成」ボタンを押し,「データベースタイプ」で「DB2」,「プロバイダー・タイプ」で「DB2 Universal JDBC Driver Provider」,「実装タイプ」で「XAデータ・ソース」を選んで,「次へ」ボタンを押します.以降のステップを進んでマスター構成に保管します.

図 2. JDBC プロバイダの作成
JDBC プロバイダの作成

J2C 認証データの作成

次に J2C 認証データを作成します.「リソース」-「JDBC」-「データ・ソース」を選んで「新規作成」ボタンを押し,「新規 J2C 認証別名の作成」をクリックして「新規作成」ボタンを押し,「別名」に「DB2」,「ユーザーID」および「パスワード」に DB2 の有効なユーザ名とパスワードを入力して「OK」ボタンを押し,マスター構成に保管します.

図 3. J2C 認証データの作成
J2C 認証データの作成

データソースの作成

続けてデータソースを作成します.「リソース」-「JDBC」-「データ・ソース」を選んで「新規作成」ボタンを押し,「データソース名」に「DB2」,「JNDI名」に「jdbc/DataSource」を入力し,「コンポーネント管理認証別名と XA リカバリーの認証別名」で先に作成した「DB2」を選択して「次へ」ボタンを押します.

図 4. データソースの作成 (ステップ 1)
データソースの作成 (ステップ 1)

ステップ 2 で「既存 JDBC プロバイダーを選択 」をチェックし,「DB2 Universal JDBC Driver Provider(XA)」を選択して「次へ」ボタンを押します.

図 5. データソースの作成 (ステップ 2)
データソースの作成 (ステップ 2)

ステップ 3 で「データベース名」に「SAMPLE」,「サーバー名」にDB2サーバの動作しているホスト名を入力して「次へ」ボタンを押します.ステップ 4 で「終了」ボタンを押して,マスター構成に保管します.

作成したデータソースの「選択」をチェックして「テスト接続」ボタンを押し,DB2 に接続できることを確認してください.


プロジェクトの作成と設定

SAStruts のダウンロード

必要な jar ファイルや設定ファイルは,SAStruts のサイトからダウンロードできる,sa-struts-blank-1.0.2.zip に含まれています.sa-struts-blank-1.0.2.zip をダウンロードして解凍し,任意のフォルダに展開してください.ここでは展開先フォルダを「sa-struts-blank」と呼びます.

プロジェクトの作成

AST で,新しい動的 Web プロジェクトを作成します.サーバプロジェクトが未作成の場合は,先に前回の記事を参照してサーバプロジェクトを作成してください.

新しく作成するプロジェクト名は sample2 とし,前回作成した EAR プロジェクトに追加します.

図 6. プロジェクトの作成
プロジェクトの作成

Jar ファイルのコピー

sa-struts-blank の webapp\WEB-INF\lib フォルダ直下に含まれる jar ファイルを sample2 プロジェクトの WebContent/WEB-INF/lib フォルダにコピーします.ただし,geronimo-jta_1.1_spec-1.0.jar はコピーしないでください.理由は,この連載の第 1 回目で述べたとおりです.

設定ファイルのコピー

sa-struts-blank の webapp\WEB-INF フォルダにある web.xml,struts-config.xml,validator-rules.xml,そして view ディレクトリを sample2 プロジェクトの WebContent/WEB-INF フォルダにコピーします.

sa-struts-blank の src\main\resources フォルダ以下を,sample プロジェクトの src フォルダにコピーします.

web.xmlの修正

コピーした web.xml ファイルを開いて <web-app> 要素の開始タグを以下のように修正します.

<web-app id="WebApp_ID" version="2.4" 
  xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation=
    "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>sample2</display-name>

web.xml を保存した後,データソースへの参照を追加します.エディタの「参照」タブで「追加」ボタンを押し,「リソース参照」を選択して「次へ」ボタンを押します.「名前」に「jdbc/DataSource」と入力し,「タイプ」で「javax.sql.DataSource」を,「認証」で「Container」を選択します.なお,「共用スコープ」に「Unshareable」を選ぶと REQUIRES_NEW などのトランザクション属性を使うことができなくなる (トランザクションを中断できなくなる) ので,必ず「Shareable」を選択してください.

図 7. リソース参照の追加
リソース参照の追加

最後に「終了」ボタンを押し,web.xml を保存します.

jdbc.dicon の修正

WAS のコネクションプールを使用するため,src フォルダにコピーした jdbc.dicon を開きます.jdbc.dicon には S2DBCP が RDBMS に接続するための設定が含まれているので,次のように修正します.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
<components namespace="jdbc">
    <include path="jta.dicon"/>
    <component name="DataSource"
        class="javax.sql.DataSource">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("jdbc/DataSource")
    </component>
</components>

s2jdbc.dicon の修正

DB アクセスに使用する S2JDBC で DB2 を使用するように設定するため,src フォルダにコピーした s2jdbc.dicon を開いて次のように修正します.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="jdbc.dicon"/>
  <include path="s2jdbc-internal.dicon"/>
  <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
      <property name="maxRows">0</property>
      <property name="fetchSize">0</property>
      <property name="queryTimeout">0</property>
      <property name="dialect">db2Dialect</property>

s2container.dicon の修正

WAS のトランザクションマネージャ (UOWManager) を使うため,src フォルダにコピーした s2container.dicon を開いて次のように修正します (UOWManager については本連載の第 2 回を参照してください).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include condition="#ENV == 'ut'" path="warmdeploy.dicon"/>
    <include condition="#ENV == 'ct'" path="hotdeploy.dicon"/>
    <include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy.dicon"/>

    <component
        class="org.seasar.framework.container.factory.SimplePathResolver">
        <initMethod name="addRealPath">
            <arg>"jta.dicon"</arg>
            <arg>"jta-was6.dicon"</arg>
        </initMethod>
    </component>
</components>

convention.dicon の修正

今回のサンプルはパッケージを sample2 とするので,src フォルダの convention.dicon を開いて次のように修正します.

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
        <initMethod name="addRootPackageName">
            <arg>"sample2"</arg>
        </initMethod>
    </component>
    <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
</components>

WAS の再起動

ここで WAS を再起動します.「コンソール」ビューでエラーメッセージが表示されることなくアプリケーションが起動できたことを確認してください.


サンプルアプリケーションの作成

サンプルアプリケーションに DB2 へアクセスする画面を追加します.このサンプルアプリケーションは,従業員の一覧画面,編集画面,確認画面を持ちます.

前回説明した HOT deploy を使うため,WAS は起動したままで構いません.

エンティティ

今回は RDB のアクセスに S2JDBC を使用します.S2JDBC は,Seasar2 のバージョン 2.4.18 から利用可能になった軽量なO/Rマッピングフレームワークで,エンティティとテーブルのマッピングには Java Persistence API (以下 JPA) のアノテーションを利用します.JPA のアノテーションは複雑なマッピングに対応していますが,S2JDBC では複雑なマッピングを除いた主要なアノテーションだけが利用可能です.

src フォルダに sample2.entity パッケージを作成し,その直下に Employee.java を作成します.

package sample2.entity;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {
    @Id
    public String empno;

    @Column(name="firstnme")
    public String firstName;

    @Column(name="lastname")
    public String lastName;

    public String job;

    public BigDecimal salary;
}

このエンティティは,SAMPLE データベースの EMPLOYEE テーブルに対応しますが,一部のカラムを抜粋してマッピングしています.

S2JDBC は,getter/setterメソッドを用いる JavaBeans 流のプロパティに加えて,public フィールドをサポートしています.public フィールドを使ってエンティティを定義すると,単調な getter/setter メソッドを記述する必要がないため,ソースコードがすっきりとします.

一覧画面

従業員の一覧を表示する画面を作成します.src フォルダに sample2.action パッケージを作成し,その直下に EmployeeAction.java を作成します.

package sample2.action;

import java.util.List;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.struts.annotation.Execute;

public class EmployeeAction {
    public List<Employee> empItems;

    public JdbcManager jdbcManager;

    @Execute(validator = false)
    public String index() {
        empItems = jdbcManager.from(Employee.class).orderBy("empno")
                .getResultList();
        return "index.jsp";
    }
}

index() メソッドで,S2JDBC を利用して Employee テーブルを全件取得しています.S2JDBC ではこのように,SQL を文字列ではなく,メソッド呼び出しのチェーンで組み立てることができます.これを「流れるようなインタフェース」と呼びます.EmployeeAction クラスの public メソッドは,連載の第 3 回で紹介した S2Tx による宣言的トランザクションが適用されるため,DB アクセスは WAS が管理するトランザクション境界の中で実行されます.

次に,WebContent/WEB-INF/view フォルダに employee というフォルダを作成し,その直下に index.jsp ファイルを作成します.

<%@page pageEncoding="UTF-8" %>
<html>
<head>
<title>Employee List</title>
</head>
<body>

<table border="1">
<tr style="background-color:pink">
<th>No</th><th>First Name</th><th>Last Name</th><th>Job</th><th>Salary</th><th>編集</th>
</tr>
<c:forEach var="e" varStatus="s" items="${empItems}">
<tr style="background-color:${s.index %2 == 0 ? 'white' : 'yellow'}">
<td align="right">${f:h(e.empno)}</td>
<td>${f:h(e.firstName)}</td>
<td>${f:h(e.lastName)}</td>
<td>${f:h(e.job)}</td>
<td align="right"><fmt:formatNumber value="${e.salary}" pattern="#,##0"/></td>
<td><a href="edit/${f:u(e.empno)}">編集</a></td>
</tr>
</c:forEach>
</table>

</body>
</html>

web.xml の JSP コンフィギュレーションで,WebContent/WEB-INF/view/common/common.jsp を include-prelude に指定しているため,個々の JSP ファイルに taglib ディレクティブを指定する必要はありません.

AST は JSP コンフィギュレーションをサポートしないため,「不明なタグ」という警告が出ますが気にしないでください.

それでは,ブラウザで http://localhost:9080/sample2/employee にアクセスしてください.従業員の一覧が表示されます.

図 8. 一覧画面
一覧画面

編集画面

従業員の情報を編集する画面を作成します.EmployeeAction.java に次のフィールドとメソッドを追加します (「インポートの編成」で import 文を補ってください).

    @Required
    public String empno;

    @Required
    public String firstName;

    @Required
    public String lastName;

    @Required
    public String job;

    @DoubleType
    public String salary;

    @Execute(validator = false, urlPattern = "edit/{empno}")
    public String edit() {
        Employee emp = jdbcManager.from(Employee.class).id(empno)
                .getSingleResult();
        Beans.copy(emp, this).execute();
        return "edit.jsp";
    }

edit() メソッドでは,主キーである従業員番号を指定して検索を行い,その結果である Employee オブジェクトのプロパティを,この EmployeeAction 自身のプロパティにコピーしています.コピーで使っている Beans クラスは S2BeanUtils が提供するクラスです.S2BeanUtils は Seasar2 に含まれています.

WebContent/WEB-INF/view/employee に edit.jsp ファイルを作成します.

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Employee Edit</title>
</head>
<body>
<html:errors/>
<s:form>
<html:hidden property="empno"/>
<table>
<tr>
<td>Id</td><td>${f:h(empno)}</td>
</tr>
<tr>
<td>First Name</td><td><html:text property="firstName"/></td>
<td>Last Name</td><td><html:text property="lastName"/></td>
</tr>
<tr>
<td>Job</td>
<td>
<html:select property="job">
<html:option value="ANALYST ">ANALYST</html:option>
<html:option value="CLERK   ">CLERK</html:option>
<html:option value="DESIGNER">DESIGNER</html:option>
<html:option value="FIELDREP">FIELDREP</html:option>
<html:option value="MANAGER ">MANAGER</html:option>
<html:option value="OPERATOR">OPERATOR</html:option>
<html:option value="PRES    ">PRESIDENT</html:option>
<html:option value="SALESREP">SALESREP</html:option>
</html:select>
</td>
</tr>
<tr>
<td>Salary</td><td><html:text property="salary"/></td>
</tr>
</tr>
</table>
<input type="submit" name="confirm" value="確認"/>
<input type="submit" name="index" value="戻る"/>
</s:form>
</body>
</html>

従業員の一覧から,適当な従業員の「編集」リンクをクリックしてください.編集画面が表示されます.

図 9. 編集画面
編集画面

確認画面

編集した内容を確認する画面を作成します.EmployeeAction.java に次のメソッドを追加します.

    @Execute(input = "edit.jsp")
    public String confirm() {
        return "confirm.jsp";
    }

単に確認画面にフォワードしています.

WebContent/WEB-INF/view/employee に confirm.jsp ファイルを作成します.

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Employee Confirm</title>
</head>
<body>
<html:errors/>
<s:form>
<html:hidden property="empno"/>
<html:hidden property="firstName"/>
<html:hidden property="lastName"/>
<html:hidden property="job"/>
<html:hidden property="salary"/>
<table>
<tr>
<td>No</td><td>${f:h(empno)}</td>
</tr>
<tr>
<td>First Name</td><td>${f:h(firstName)}</td>
</tr>
<tr>
<td>Last Name</td><td>${f:h(lastName)}</td>
</tr>
<tr>
<td>Job</td><td>${f:h(job)}</td>
</tr>
<tr>
<td>Salary</td>
<td><fmt:formatNumber value="${f:number(salary, '####')}" pattern="#,###"/></td>
</tr>
</table>
<input type="submit" name="store" value="更新"/>
<input type="submit" name="backToEdit" value="戻る"/>
</s:form>
</body>
</html>

編集画面で「Job」を「ANALYST」に変更して「確認」ボタンを押してください.確認画面が表示されます.

図 10. 確認画面
確認画面

データベースの更新

確認画面に表示した内容で DB を更新します.EmployeeAction.java に次のメソッドを追加します.

    @Execute(input = "confirm.jsp")
    public String store() {
        Employee emp = Beans.createAndCopy(Employee.class, this).execute();
        jdbcManager.update(emp).execute();
        return index();
    }

    @Execute(validator = false)
    public String backToEdit() {
        return "edit.jsp";
    }

store() メソッドは,確認画面で「更新」ボタンが押されたときに呼び出されるメソッドです.S2BeanUtils を使用して,この EmployeeAction 自身の持っているプロパティをコピーした Employee を作成しています.その Employee を S2JDBC に渡すことで,テーブルが更新されます.store() メソッドも S2Tx による宣言的トランザクションが適用されるため,WAS が管理するトランザクション境界の中で呼び出されます.store() メソッドが例外をスローすると,更新はロールバックされます.

backToEdit() メソッドは,確認画面で「戻る」ボタンが押されたときに呼び出されるメソッドで,編集画面にフォワードしています.

確認画面で「更新」ボタンを押してください.更新後の従業員一覧が表示されます.

図 11. 一覧画面 (更新後)
一覧画面 (更新後)

最後に

WAS のコネクションプールとトランザクション機能を Seasar2 から利用するための設定方法と,そのサンプルアプリケーションを説明しました.

サンプルアプリケーションで使用した Web アプリケーションフレームワークの SAStruts,O/R マッピングフレームワークの S2JDBC の詳細については,各プロダクトのドキュメントを参照してください.

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere, Java technology, Open source, Web development
ArticleID=316096
ArticleTitle=Seasar2: 第 5 回 Seasar2 から DB2 を利用する
publish-date=06272008