[Seasar-user:20444] DataSourceからのコネクション設定 と コミットについて

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2010年 12月 19日 (日) 18:33:32 JST


こんにちは。
pianyiと申します。

以前「[Seasar-user:20245] S2DAO による、SavePoint の使用について」で質問しましたが、
うまく動作しませんでしたので、お知恵を拝借願います。
(長文にて失礼します)

以前教えて頂いた実装方法を使用させて頂いておりますが、正しく動かず、糸口がつかめない状態です。
下記のように実装しておりますので、問題点等ございましたらご指摘をお願い致します。
また、情報不足が有りましたら、ご指摘をお願いします。
(提示させて頂きます)


現象:
・DAOのINSERT文を実行直後に既にコミットされているように見える。

確認内容:
・デバッグでINSERT文実行直後に止め、別セッション(オブジェクトブラウザなど)のSELECT文に表示される。
・INSERT文実行直後、rollback() を呼び出しても、SELECT文に表示される。
・



ご面倒をお掛けいたしますが、よろしくお願い致します。


********ここからログ********
物理的なコネクションを取得しました。
論理的なコネクションを取得しました。tx=null    // ← begin 呼出直後
物理的なコネクションを取得しました。
論理的なコネクションを取得しました。tx=null
SQLの実行ログ
論理的なコネクションを閉じました。             // ← DAOからINSERT 分を呼び出しが完了した状態
                                               // 該当テーブルを検索するとデータがヒットします。
********ここまでログ********


********ここからソース********
DatabaseLogic.java (DB接続親クラス)

DatabaseLogic{
フィールド:
Connection con = null;
DataSource dataSource = null;

コンストラクタ(DataSource aDataSource){
    dataSource = aDataSource
}

void begin(){
    Connection con = ((ConnectionWrapper) dataSource.getConnection()).getPhysicalConnection();
    con.setAutoCommit( false );
}

void commit(){
    con.commit();
}

void savePoint(){
    con.savePoint();
}

void rollback(){
    con.rollback();
}

void rollback(String name){
    con.rollback(name);
}
}


UserInfoLogic.java (DB接続子クラス)

UserInfoLogic extends DatabaseLogic {
フィールド:
テーブルAのDAO aDao = null;
テーブルBのDAO aDao = null;

コンストラクタ(DataSource aDataSource, テーブルAのDAO aADao, テーブルBのDAO aBDao){
    super(aDataSource);
    aDao = aADao;
    bDao = aBDao;
}

insert(){
    aDao.insert();     // ← この行実行後既にコミットされている
    bDao.update();
}
}


UserInfo.java(DB呼出クラス(コンポーネント紐付け))

UserInfo{

static void boolean insert(){
    S2Container container = SingletonS2ContainerFactory.getContainer();
    UserInfoLogic logic = (UserInfoLogic)container.getComponent(UserInfoLogic.class);
    logic.inert();
}

static void boolean begin(){
    S2Container container = SingletonS2ContainerFactory.getContainer();
    UserInfoLogic logic = (UserInfoLogic)container.getComponent(UserInfoLogic.class);
    logic.begin();
}

static void boolean commit(){
    S2Container container = SingletonS2ContainerFactory.getContainer();
    UserInfoLogic logic = (UserInfoLogic)container.getComponent(UserInfoLogic.class);
    logic.commit();
}

static void boolean rollback(){
    S2Container container = SingletonS2ContainerFactory.getContainer();
    UserInfoLogic logic = (UserInfoLogic)container.getComponent(UserInfoLogic.class);
    logic.rollback();
}

static void boolean savepoint(){
    S2Container container = SingletonS2ContainerFactory.getContainer();
    UserInfoLogic logic = (UserInfoLogic)container.getComponent(UserInfoLogic.class);
    logic.savepoint();
}
}



main.java(メインクラス)

main{
    UserInfo info = new UserInfo();
    try{
        for(inti = 0; i < 10; i ++) {
            info.begin();
            info.insert();
            info.savepoint();
        }
        info.commit();
    }catch(Exceptin e){
        info.rollback();
    }
}
********ここまでソース********


また、dao.dicon はMETADATAを取得しない方法
(サンプルから外だししたやつ?)を使うようにしています。


開発環境: 
・Java1.5.0_12 
・Oracle10.2.0.1 
・s2-struts-1.2.10.jar 
・s2-dao-1.0.49.jar 
・s2-extension-2.4.32.jar 
・s2-framework-2.4.32.jar


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