[Seasar-user:18754] Re: [S2Dao]スレッドで起動した際にエラーとなる

TetsuyaSawada [E-MAIL ADDRESS DELETED]
2009年 10月 23日 (金) 15:18:08 JST


中村(taedium)様

お世話になっております。
澤田です。

先ほどのメール、バージョンを書くのを忘れておりました。

当方環境では、
s2-dao-1.0.47
s2-extension-2.3.23
s2-framework-2.3.23

です。

以上、よろしくお願いします。
-----Original Message-----
From: [E-MAIL ADDRESS DELETED]
[mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of TetsuyaSawada
Sent: Friday, October 23, 2009 2:48 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:18751] Re: [S2Dao]スレッドで起動した際にエラーとなる

中村(taedium)様

お世話になっております。
澤田です。

現在は修正して例外が発生しなくなってしまったのですが、状況としては以下のよう
な感じでした。
まだ、開発途上でログは保管しておりませんでした。
他の業務処理などを加えており再現させるにはソースを戻す必要があるので、
問題が再発した場合には採取しておきたいと思います。

まず、環境はスタンドアロンです。
以下の要領でS2Containerを生成し、それを全てのコードから使用していました。

public class S2ContainerManager {
    private static final S2Container container;

    static {
        SingletonS2ContainerFactory.setConfigPath("hoge.dicon");
        SingletonS2ContainerFactory.init();
        container = SingletonS2ContainerFactory.getContainer();
    }
}

スレッドを起動するクラスは以下のような感じです。

public class ExecBusiness {

    private java.util.concurrent.ExecutorService execService =
java.util.concurrent.Executors.newFixedThreadPool(5)

    // 下記メソッドはmainスレッドから呼ばれています。
    public void observe() {

        // 下記のdaoはj2ee.requiredTxを編みこんだDAOです。
        List<Job> jobList = dao.getWaitingJob();

            for(Job job : jobList) {
                HogeExecutor executor = new HogeExecutor(job);

                execService.submit(executor);
            }
	}
    }
}

スレッドに空きができると上記executorのcallメソッドが呼ばれて処理が行われま
す。
その処理の中でj2ee.requiresNewTxを編みこんだTBL更新クラスのメソッドが一度だ
け呼ばれ、
SELECTやUPDATEクエリが発行されるのですが、その際に「コネクションはすでに閉じ
られています」というメッセージで落ちてしまいます。
なお、落ちない場合もあり、ループの中で50ミリ秒くらい間隔をあけてやると全く落
ちませんでした。
TBL更新クラスとその中で使用しているDAOを定義するdiconは以下のような感じに
なっています。

<components namespace="MyDao" >
    <component name="HogeDao" class="org.hoge.HogeDao" instance="prototype"
>
        <aspect>j2ee.requiredTx</aspect>
	<aspect>dao.interceptor</aspect>
    </component>
    <component name="Tran" class="org.hoge.Tran" instance="prototype" >
        <aspect>j2ee.requiresNewTx</aspect>
        <arg>HogeDao</arg>
    </component>
</components>

なお、現在は、S2ContainerManagerクラスを使用せず、
executorのcallメソッドの中でS2ContainerFactory.createを呼び、新しくコンテナ
を生成することで例外が発生しなくなっています。

以上、よろしくお願いします。
-----Original Message-----
From: [E-MAIL ADDRESS DELETED]
[mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of Toshihiro Nakamura
Sent: Friday, October 23, 2009 12:22 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:18744] Re: [S2Dao]スレッドで起動した際にエラーとなる

中村(taedium)です。

> S2Daoを使用して開発を行っている中で、
> 間隔をあけずにスレッドを起動し、順次SQLを発行するロジックで、
> SQLが発行できているスレッドと、エラーで停止してしまうスレッドがあります。

スタンドアロン環境なのかWeb環境なのか、
どこでどのようにスレッドを起動しているのか、
トランザクション境界をどこにおいているのか、
などの情報があると何かわかるかもしれません。

例外のスタックトレースもあったほうがいいですね。

あとはSeasar2やS2Daoのバージョンも教えてください。

--
Nakamura Toshihiro <[E-MAIL ADDRESS DELETED]>

_______________________________________________
Seasar-user mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/seasar-user


_______________________________________________
Seasar-user mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/seasar-user




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