[Seasar-user:766] Re: JndiDataSource/JndiTransactionManager でStackOverflowError

B isid.co.jp Yasuo Higa higa
2004年 5月 23日 (日) 17:23:50 JST


<[E-MAIL ADDRESS DELETED]> の、
   "[Seasar-user:763] JndiDataSource/JndiTransactionManagerでStackOverflowError" において、
   ""s.chinen" <[E-MAIL ADDRESS DELETED]>"さんは書きました:

ひがです。

> はじめまして。知念といいます。
> 
> 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が発生。
> 
以前、R2D2さんから指摘を受けていたものの原因がわからず、
Sel(今ならOGNL)を使うやり方で、対処していたのですが、
やっと原因がわかりました。
ご指摘ありがとうございます。
Seasar V2.0.9に間に合わせてリリースしたいと思います。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.



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