[Seasar-user:19454] HOT deploy が有効なとき、新規に起動したスレッドから Dao 操作を行うと例外が発生

fjt ykhs [E-MAIL ADDRESS DELETED]
2010年 3月 5日 (金) 16:49:24 JST


お世話になっております、藤田と申します。

以下のような現象が起こっているのですが、うまく問題の切り分けができず困っています。
何か調査のヒントがありましたら、ご教示いただけると幸いです。

■ 概要
HOT deploy が有効なとき、新規に起動したスレッドから
2 回以上 Dao 操作を行うと、 2 回に 1 回例外が発生します。

Web 画面 (Teeda 使用) のボタンから、 (できれば避けたいですが) Thread を起動し、
その新規 Thread 内で Dao を呼び出しています。
1回目の呼び出しは成功するのですが、2回目の呼び出しで失敗し、以後、
ボタンを押すたびに「成功→例外→成功→例外→成功→……」を繰り返します。

■ 環境
jdk           1.6.0_16
apache-tomcat 6.0.20
s2-framework  2.4.39
s2-extension  2.4.39
s2-tiger      2.4.39
s2-dao        1.0.49.
Teeda         1.0.13-sp7
※ ログは上記で取得しましたが、 S2framework, S2Dao, Teeda を最新バージョンに
   アップデートして試しても同じ現象が発生しました。

■ 発生する例外
以下の例外が 2 回に 1 回 (正確に交互に) 発生します。

Exception in thread "Thread-18"
org.seasar.framework.beans.IllegalPropertyRuntimeException:
[ESSR0059]クラス(xxxproject.yyyyproject_core.entity.SampleOnbatchExecHist)のプロパティ(jobnetName)の設定に失敗しました。理由はjava.lang.IllegalArgumentException:
Can not set java.lang.String field
xxxproject.yyyyproject_core.entity.SampleOnbatchExecHist.jobnetName to
xxxproject.yyyyproject_core.entity.SampleOnbatchExecHist

■ 問題発生部分のコードイメージ
□ Web 画面 (Teeda 使用) のボタンから呼ばれるコード
        Thread t = new Thread(new OnBatchThread());
        t.start();

□ OnBatchThread 内のコード
        OnBatchService onBatchService =
SingletonS2Container.getComponent(OnBatchService.class);
        // 内部で Dao 呼び出し
        onBatchService.sampleMethod();

□ OnBatchServiceImpl.sampleMethod() 内の処理
         // 新規 insert
         MtsysOnbatchExecHist mtsysOnbatchExecHist = new MtsysOnbatchExecHist();
         mtsysOnbatchExecHistDao.insert(mtsysOnbatchExecHist);  //
(*1) ← ここで例外発生
         // insert したレコードを update
         mtsysOnbatchExecHist.status = 1;                       //
(*2) 以下の「試したこと」で参照
         mtsysOnbatchExecHistDao.update(mtsysOnbatchExecHist);  //
(*2) 以下の「試したこと」で参照

サンプル用に、 insert してすぐに update するようにコードに簡略化
しても問題が発生しています。詳細を「試したこと」に記述します。

■ 試したこと
 - 最新バージョンの Seasar, S2Dao, Teeda
   → ×: 結果、変わらずでした。
 - HOT deploy をやめて COOL deploy に変更
   → ○: 正常に完了しました。 (Seasar の使い方・規約を間違っている???)
 - スレッドの起動をやめて、 OnBatchServiceImpl.sampleMethod() を普通に呼び出し
   → ○: 正常に完了しました。 (スレッドを使うことは許されていない???)
 - 例外が発生する部分 (*1) に Eclipse でブレークポイントを設定
   → ○: 正常に完了しました。 (ブレークポイントの有無だけで結果が変わる???)
 - (*2) 部分のコードを削除
   → ○: 正常に完了しました。 (例外が発生する部分とより後のコードが何か影響している???)

■ 添付ログ
 - Tomcat 起動ログ (起動ログ.txt)
 - 成功時ログ (good.txt)
 - 失敗時ログ (bad.txt)

上記のような内容を試してみたのですが、何か勘違いしていそうなポイントが
あれば、ヒントをいただけると助かります。

以上、よろしくお願いいたします。

-- 
FUJITA Yukihisa
mailto:[E-MAIL ADDRESS DELETED]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: log.zip
Type: application/zip
Size: 8584 bytes
Desc: $BL5$7(B
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20100305/d2ceaeb5/attachment.zip>


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