Seasar DI Container with AOP

セットアップ

Javaでデータベースにアクセスするには、データソースを経由したコネクションプールを使うのが一般的です。 コネクションプールは通常、アプリケーションサーバが実装しますが、 Tomcatのようなトランザクションと連動するコネクションプールの実装のないアプリケーションサーバ用に S2DBCPを用意しています。

データソースの設定は、jdbc.diconで行ないます。 jdbc.diconはクラスパスの通っているディレクトリ、 通常はWEB-INF/classesにおきます。

S2DBCP

XADataSource、ConnectionPoolの設定をおこないます。 JDBC DriverがXADataSourceの機能を提供している場合は、 それをそのまま使えますが、 提供されていない場合、S2で用意しているXADataSourceImplを使って、XAの機能をエミュレートします。

org.seasar.extension.dbcp.impl.XADataSourceImpl

プロパティ 説明
driverClassName JDBC Driverのクラス名 "oracle.jdbc.driver.OracleDriver"
URL RDBMS固有のURL "jdbc:oracle:thin:@xxx:1521:yyy"
user ユーザ名 "hoge"
password パスワード "password"
loginTimeout ログインタイムアウト時間 (秒単位) 2

org.seasar.extension.dbcp.impl.ConnectionPoolImpl

プロパティ 説明
XADataSource XADataSourceのインスタンスを設定します。S2Containerで設定する場合は、XADataSourceのコンポーネント名を設定します。
必須です。
xaDataSource
transactionManager TransactionManagerのインスタンスを設定します。S2Containerで設定する場合は、TransactionManagerのコンポーネント名を設定します。
必須です。
TransactionManager
timeout プールに戻されたコネクションがここで指定された秒数以上未使用だった場合、物理的にクローズされて破棄されます。
デフォルトは600(10分)です。
600
maxPoolSize 同時にアクティブになれる コネクションの数を指定します。 この数を超える要求があると、コネクションがプールに返されるまで その要求はブロックされます。
0を設定するとコネクションはプールされず、コネクションの取得要求はブロックされません。
デフォルトは10です。
10
allowLocalTx JTAによって制御されない、JDBCのローカルトランザクションを許可する (true) しない (false) を指定します。
falseを指定すると、JTAによるトランザクションが開始されていない状態でコネクションの取得が行われた場合に例外 (java.lang.IllegalStateException) がスローされます。
開発時にfalseを指定すると、S2Txが提供するトランザクション・インターセプタの設定漏れを確実に検出することができます。
デフォルトはtrueです。
true

コンポーネントの設定は以下のようになります。環境に合わせて書き換えてください。

jdbc.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 namespace="jdbc">
    <include path="jta.dicon"/>
    <include path="jdbc-extension.dicon"/>
    
    <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
    <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>

    <component name="xaDataSource"
            class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
        <property name="driverClassName">
            "oracle.jdbc.driver.OracleDriver"
        </property>
        <property name="URL">
            "jdbc:oracle:thin:@xxx:1521:yyy"
        </property>
        <property name="user">"aaa"</property>
        <property name="password">"bbb"</property>
    </component>
    <component name="connectionPool"
            class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
        <property name="timeout">600</property>
        <property name="maxPoolSize">10</property>
        <property name="allowLocalTx">true</property>
        <destroyMethod name="close"/>>
    </component>
    <component name="dataSource"
       class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>

一般的なアプリケーションサーバ

一般的なアプリケーションサーバでは、JNDI経由(JndiResourceLocator)でデータソースを取得します。

jdbc.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 namespace="jdbc">
    <include path="jta.dicon"/>
    <include path="jdbc-extension.dicon"/>
    
    <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
    <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>

    <component name="dataSource"
            class="javax.sql.DataSource">
        @org.seasar.extension.j2ee.JndiResourceLocator@lookup("JNDI名")
    </component>
</components>