- - PR -
テーブル更新処理を全件終えた後にコミットしたい
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-04-24 00:11
そういや、S2Daoを使う時のdiconファイルの記述ですが、
S2DaoのInterceptorとTraceInterceptorと JTAのInterceptorの記述順によってトランザクションログが 出たり出なかったりという現象が発生しました。 その時は、S2DaoのInterceptorを後に記述して、 先にJTAのInterceptorを記述するようして トランザクションログが出力されました。 参考になればいいですが、S2Daoなので何ともいえませんね。。。 参考までに。 | ||||
|
投稿日時: 2005-04-24 02:34
私の環境では、普通にログはでていますね・・・
DEBUG 2005-04-24 02:10:25,528 [main] トランザクションを開始しました <中略> DEBUG 2005-04-24 02:10:25,998 [main] 物理的なコネクションを取得しました DEBUG 2005-04-24 02:10:26,008 [main] 論理的なコネクションを取得しました <中略> WARN 2005-04-24 02:10:26,028 [main] SQL Error: 1062, SQLState: 23000 ERROR 2005-04-24 02:10:26,028 [main] Duplicate key or integrity constraint violation message from server: "Duplicate entry '1' for key 1" <中略> DEBUG 2005-04-24 02:10:26,038 [main] トランザクションをロールバックしました とこんな具合です。ここでは主キーを重複させてエラーを発生させ、ロールバックがなされています。 普通にコミットされてしまうということは、逆に処理がうまく行ってたりはしないでしょうか・・・?デバッガなどで追うとどうでしょう? | ||||
|
投稿日時: 2005-04-24 15:02
> かつのりさま
アドバイスありがとうございます。 Interceptorの書き方、見てみました。 私の場合、Interceptorは2種類書いてありました。 1つはS2hibernateDAOで、s2hibernate.diconに <component name="interceptor" class="org.seasar.hibernate.dao.interceptors.S2HibernateDaoInterceptor"/> もう1つはTraceInterceptorで、s2xwork.xmlに <component name="traceInterceptor" class="org.seasar.framework.aop.interceptors.TraceInterceptor"/> かつのりさんの書いてくださったものと比較してみると、JTAのInterceptorというものがそもそも私のほうには存在しないのです・・・。 JTAのInterceptorとは何でしょうか? 恐れ入りますが、ご教授頂けますと嬉しいです。。 よろしくお願いします。 | ||||
|
投稿日時: 2005-04-24 15:18
> Odakazさま
ありがとうございます。 eclipseのデバッガで追うと、 私の場合は、途中であるはずのデータが存在しなく、SQLExceptionなどではなく、自分で落としています。 ■HogeDAOの以下の部分でelseに入り、Exceptionを投げます。 // 該当データが存在するか検索 List result = session.find("from UserTbl as u where u.userId = ?",warr[j][i],Hibernate.STRING); if (result.size() > 0) { usertbl = (UserTbl) result.get(0); } else { throw new Exception("エラーメッセージ"); } ■ExceptionをHogeActionでcatchし、return INPUTでエラー画面を出力させます。 try { // 更新処理 ret = hogedao.updUser(warr,lineCnt); } catch (〜〜Exception 〜〜e){ log.error(〜〜e.getCause()); log.info("異常終了"); return INPUT; } 確かに人為的な異常終了の仕方で、処理はうまく「片付けてる」と思っているのですが、もしかしてこれでは予想できる例外処理なので、rollbackされないということになるのでしょうか?? 申し訳ありませんが、アドバイスを頂けますと有難いです。。。 よろしくお願い致します。 | ||||
|
投稿日時: 2005-04-30 00:15
>=== HogeAction.java =================================
>HogeDAO hogedao = new HogeDAO(); 本当にこう書いてあるんですか? HogeDAOはコンテナから取得しないとAOPが働かないので、トランザクション管理は出来ませんよ。 | ||||
|
投稿日時: 2005-04-30 01:34
あ、ホントですね。思い切り見逃していました・・・ これで解決かな? | ||||
|
投稿日時: 2005-05-03 20:04
> TA2さま・Odakazさま
貴重なお答え、どうもありがとうございました。 仰るとおりの間違いの修正で、なんとか解決に至ることができました。 AOPを使用するクラスは、newしちゃいけないんですね。 SeasarのAOPの説明ページを読んで判りました。 おかげさまで、ちゃんとロールバックもしてくれて、 ログも見ることができるようになりました。 本当に皆さん、大変大変お世話になりました。 どうもありがとうございました。 | ||||
|
投稿日時: 2005-05-03 20:45
というより、DIコンテナに登録したクラスのインスタンス化は(AOPで機能を織り込むかどうかにかかわらず)、DIコンテナに任せないとDIの恩恵を受けられませんね〜 [ メッセージ編集済み 編集者: Odakaz 編集日時 2005-05-03 21:19 ] |
«前のページへ
1|2|3