[Seasar-user:763] JndiDataSource/JndiTransactionManagerでStackOverflowError

B pc.club.ne.jp s.chinen s_chinen
2004年 5月 23日 (日) 16:44:30 JST


はじめまして。知念といいます。

S2本体に含まれているサンプルを実行するのに
WebLogicのデータソースやトランザクションマネージャーを利用しようと
j2ee.diconを自分の環境用に編集し、実際にサンプルを実行したところ、
StackOverflowErrorが発生する現象に遭遇しました。

原因がまるで検討つかなかったので、
S2の勉強がてらコンポーネントのインスタンス生成およびメソッドの呼び出しを
ソースを追っかけたり直接ステップ実行して追ってみたりしたところ、
StackOverflowError発生までの流れがだいたい以下のようになっているのを確認しました。

1.コンテナ内部でJndiDataSourceコンポーネントのインスタンスが生成される。
  この際、JndiDataSource(InitialContext, String)のコンストラクタが呼び出され、
  親クラスのプロパティphysicalDataSourceにWebLogicから取得したDataSourceがセットされる。

2.インスタンス生成後、プロパティに対する自動バインディングが動き、
  セッターメソッドsetPhysicalDataSource(DataSource)が呼ばれ、
  メソッドの引数にマッチするコンポーネントとして自分自身がセットされる。
  (ここでコンポーネントとプロパティphysicalDataSourceが同じオブジェクトになる。)

3.コンポーネント利用者がコンテナのgetComponent()を呼び出して
  DataSource(JndiDataSource)を取得する。

4.コンポーネント利用者が取得したDataSourceのメソッドgetConnection()を呼び出す。

5.JndiDataSourceはプロパティphysicalDataSourceのgetConnection()を呼び出す。
  プロパティphysicalDataSourceにセットされているDaraSourceも自分自身のため、
  ここでStackOverflowErrorが発生。

# JndiTransactionManagerにつてもほぼ同じ流れでStackOverflowErrorが発生します。

とりあえず、autoBinding属性に「constructor」か「none」を指定し、
ステップ2の部分(プロパティに対する自動バインディング)を抑制することで
上記の現象に対しては対応はできました。

以下は最終的にサンプルの稼動を確認できた定義です。

----- j2ee.dicon(WebLogicに関する定義部分のみ) -----

    <component name="properties" class="java.util.Properties">
        <initMethod>
            #self.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory"),
            #self.setProperty("java.naming.provider.url","t3://localhost:7001/")
        </initMethod>
    </component>
    <component name="initialContext" class="javax.naming.InitialContext">
        <arg>properties</arg>
    </component>
    <component
        name="transactionManager"
        class="org.seasar.extension.j2ee.JndiTransactionManager"
        autoBinding="constructor">
        <arg>initialContext</arg>
        <arg>"javax.transaction.TransactionManager"</arg>
    </component>
    <component
        name="dataSource"
        class="org.seasar.extension.j2ee.JndiDataSource"
        autoBinding="constructor">
        <arg>initialContext</arg>
        <arg>"jdbc/MySQLDataSource"</arg>
    </component>

-----

autoBindingを指定しないとエラーになるというのは、
別にWebLogic固有の問題ではないとと思うので、
j2ee.dicon内のWebLogic以外のAPサーバーの設定例についても
記述の修正が必要になるかと思います。

# JBossで試してみたらやっぱりStackOverflowErrorが発生しました。

以上、初投稿にも関わらず長文失礼致しました。

*********************************************************************

知念 智
mail:[E-MAIL ADDRESS DELETED]

*********************************************************************





Seasar-user メーリングリストの案内