[Seasar-user:12566] Re: Seasar2トランザクションロールバックについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 1月 19日 (土) 15:15:14 JST


小林 (koichik) です.

Date:    Sat, 19 Jan 2008 10:57:11 +0800
From:    "Tidever Chenglong Tian" <[E-MAIL ADDRESS DELETED]>
To:      "seasar-user" <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:12563] Seasar2トランザクションロールバックについて

> BaseDao:
> --------------------------------
> public abstract class BaseDao {
>  private final static String DICON_DIR = "jp/co/dicon/";
>  private final static String DICON_EX = ".dicon";
>  public int updateSQL(String component, Object[] args) {
>   int result;
>   String classFullName = this.getClass().getName();
>   String diconPath = getDiconPath(classFullName);
>   S2Container container = S2ContainerFactory.create(diconPath);
>         container.init();

ここで毎回 S2Container を作成しているのが
原因です.
ここで作成された S2Container のコネクション
プールは,トランザクション制御が行われている
S2Container  (LoginAction や testService が
存在する) とは無関係です.
そのため,この S2Container から取得される
コネクションはトランザクション制御されておらず,
AutoCommit の状態となっています.

そして,

>         } finally {
>             container.destroy();

ここで S2Container の後処理が行われるため
コネクションプールおよび物理コネクションが
クローズされます.


BaseDao で S2Container を作成しないように
してください.
代わりに,S2Container 型のプロパティを
持たせてください.

public abstract class BaseDao {
 private S2Container container;
 public void setContainer(S2Container container) {
  this.container = container;
 }

 public int updateSQL(String component, Object[] args) {
  int result;
  Object obj = container.getComponent(component);
  UpdateHandler handler = (UpdateHandler)obj;
  result = handler.execute(args);
  return result;
 }
}


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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