Seasar DI Container with AOP

Oracle 10g AS上でSeasar2.4を動かすための設定

Seasar2.4はOracle Application Server上で動作します。

以下、動作確認に利用した環境やアプリケーションの設定についてOracle Application Serverとの連携に必要なものを中心に説明します。

目次

動作環境

動作環境の構成

動作確認に用いた環境は次の通りです。

ハードウェア HP ProLiant DL360 G5 server
CPU:Intel(R) Xeon(R) CPU 5160 3.00GHz (x2)
メモリ:2GB
OS Red Hat Enterprise Linux AS 4 Update 2 (AMD64/Intel EM64T)
アプリケーションサーバー Oracle Application Server 10g Release 3 (10.1.3.0) for Linux x86
RDBMS Oracle Database 10g Release 2 (10.2.0) for Linux x86-64

動作確認に用いたアプリケーションは、データベースの内容を一覧取得、追加、更新、削除、照会といった一連の機能を提供するWebアプリケーションです。

主な技術要素としては、EJB3.0、JSF1.1、JPA1.0を使用しています。EJBコンテナの実装としてS2Container、JSFの実装としてTeedaを利用します。JPAの実装にはHibernateを利用します。Kuina-DaoはJPAに対するDAOとして利用します。

使用したSeasar2のプロダクトとそのバージョンは次の通りです。

S2Container 2.4.12-SNAPSHOT
Teeda 1.0.7-SNAPSHOT
S2Hibernate-JPA 1.0.0-rc2-SNAPSHOT
Kuina-Dao 1.0.0-rc2-SNAPSHOT

Subversionリポジトリ

動作確認に使用したソースコードや依存jarファイル一式は以下のリポジトリにあります。設定情報の詳細はこちらを参照してください。
https://www.seasar.org/svn/s2container/trunk/employee-benchmark/employee-seasar2-teeda-oc4j

データソースの設定

アプリケーションサーバー

アプリケーションサーバーにデータソースを設定します。設定の方法はアプリケーションサーバーのドキュメントを参照してください。 ここではデータソースのJNDI名にjdbc/dataSourceと設定するものとします。

web.xml

webアプリケーションからデータソースを利用するので以下のようにresource-ref要素を定義します。
    ・・・
    <resource-ref>
        <res-ref-name>jdbc/dataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>    
    </resource-ref>
    ・・・

jdbc.dion

データソースはJNDIからルックアップするように定義します。ルックアップのキーにはjava:comp/env/リソース名を指定してください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
    <include path="jta.dicon"/>
    <include path="jdbc-extension.dicon"/>

    <component class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/>
    <component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
        <arg>
            <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
        </arg>
        <property name="fetchSize">100</property>
        <!--
        <property name="maxRows">100</property>
        -->
    </component>

    <!-- from JNDI -->
    <component name="dataSource"
        class="javax.sql.DataSource">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/dataSource")
    </component>
    
</components>

JTAの設定

oc4j-jta.dion

アプリケーションサーバーのJTAと連動するために以下の設定を行います。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
    "http://www.seasar.org/dtd/components21.dtd">
<components namespace="jta">

    <!-- Oracle10gAS -->
    <component name="TransactionManager"
            class="javax.transaction.TransactionManager">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/UserTransaction")
    </component>
    
    <!-- UserTransaction from JNDI -->
    <component name="UserTransaction"
            class="javax.transaction.UserTransaction">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/UserTransaction")
    </component>
    
</components>

s2container.dion

s2container.diconにSimplePathResolverを定義し、Seasar2のjarファイルに同梱されているjta.diconoc4j-jta.dionに置き換えるように指定します。

<?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="hotdeploy.dicon"/>
    <include condition="#ENV != 'ut'" path="cooldeploy.dicon"/>

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

JPAの設定

persistence.xml

jta-data-source要素にはアプリケーションサーバーに定義したデータソースのJNDI名を指定します。
アプリケーションサーバーと連携するためにhibernate.transaction.manager_lookup_classプロパティを設定します。 データベースと連携するためにhibernate.dialectプロパティを設定します。

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
    <persistence-unit name="persistenceUnit" transaction-type="JTA">
        <jta-data-source>jdbc/dataSource</jta-data-source>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.transaction.manager_lookup_class" 
                value="org.hibernate.transaction.OC4JTransactionManagerLookup"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="false"/>
        </properties>
    </persistence-unit>
</persistence>

jpa.dion

アプリケーションサーバーで管理された永続ユニットをJNDIで取得して利用するためにJndiPersistenceUnitProviderを定義し、永続ユニット名と永続ユニットのJNDI名を対応づけます。このコンポーネントはJNDIから永続ユニットをルックアップして返します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN" 
    "http://www.seasar.org/dtd/components23.dtd">
<components>
    <include path="s2hibernate-jpa.dicon"/>
    
    <component class="org.seasar.framework.jpa.impl.JndiPersistenceUnitProvider">
        <initMethod name="addJndiName" >
            <arg>"persistenceUnit"</arg>
            <arg>"employee-seasar2-teeda-oc4j/persistenceUnit"</arg>
        </initMethod>
    </component>

    <component name="entityManagerFactory" class="javax.persistence.EntityManagerFactory">
        jpa.persistenceUnitManager.getEntityManagerFactory("persistenceUnit")
    </component>

    <component name="entityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"/>

    <component class="org.seasar.hibernate.jpa.metadata.HibernateEntityDescProvider"/>

</components>

デプロイのための設定

アプリケーションサーバーにデプロイを行うには以下の設定が必要になります。

  • リソース参照名とJNDI名のマッピング
  • クラスローディングの設定

リソース参照名とJNDI名のマッピングはWebアプリケーションからリソース参照名でリソースにアクセスするために必要です。ここではjdbc/dataSourceというリソース参照名をjdbc/dataSourceというJNDI名にマッピングします。

クラスローディングの設定はOC4J上でHibernateを利用するために必要です。ここでは、OC4Jにパッケージされたantlr.jarとHibernateが依存するアプリケーションのantlr.jarのクラスの衝突を避けるため、oracle.toplink共有ライブラリを明示的に削除します。

以下は、Application Server Controlコンソールで保存したデプロイプランの内容です。

moduleType=ear
applicationID=employee-seasar2-teeda-oc4j
bindWebApp=default-web-site
webSiteBindings=
parent=default
moduleID=.
doctype=orion-application
<?xml version="1.0" encoding="UTF-8"?>
<orion-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-application-10_0.xsd">
    <imported-shared-libraries>
        <remove-inherited name="oracle.toplink">
        </remove-inherited>
    </imported-shared-libraries>
</orion-application>
moduleID=employee-seasar2-teeda-oc4j.war
doctype=orion-web-app
<?xml version="1.0" encoding="UTF-8"?>
<orion-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/orion-web-10_0.xsd" 
    context-root="employee-seasar2-teeda-oc4j">
    <resource-ref-mapping name="jdbc/dataSource" location="jdbc/dataSource">
    </resource-ref-mapping>
    <web-app-class-loader>
    </web-app-class-loader>
</orion-web-app>