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