[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 メーリングリストの案内