database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38549 게시물 읽기
No. 38549
Ibatis에서 트렌젝션의 범위가 명확하지 않습니다.
작성자
윤명철
작성일
2011-05-12 14:14ⓒ
2011-05-12 22:38ⓜ
조회수
4,613

Ibatis는

SqlMapClient는 스레드 세이프로 만들어져있고

싱글톤으로 하나만 만들어 사용하는것으로 나와있고

하나의 스레드에 대해서 트렌젝션을 수행한다고 알고 있습니다.

예를들어

sqlMap.startTransaction()을 걸면 호출한 스레드가 트렌젝션처리를 위한 유일한 컨넥션 개체를 갖고 있고

sqlMap.update("aa.upd", vo);

sqlMap.insert("aa.insert", vo);

sqlMap.endTransaction()

을 걸면 connetcion의 commit및 반환을 수행한다고 나와있는데

 하나인 SqlMapClient클래스에 여러객체에서 동시에 DB작업을 요청할텐데

각각 요청에대해서 startTransaction()시 스레드별로 컨넥션을별도로 할당및 기억하고 있고 그 기억을 바탕으로 트렌젝션을 수행한다고 생각하면 될까요 ?

 

그리고 그 스레드라는 범위에 대해서는

웹페이지에 하나의 Request에대해 하나의 스레드라고 생각해도 무방하겠습니까 ?

예를들어 Spring 하고 같이 사용한다고 하면

aaa.do라는 웹주소로 요청(Request)이 들어왔다면

해당 요청에 대해 하나의 스레드가 생성되고 그 스레드에 대해 Ibatis는 startTransaction()시에 트렌젝션을 수행한다고 봐야되겠지요 ?

 

또한 설계패턴에서

Logic에서 트렌젝션을 관리한다고 하면(원래는 Dao에서 트렌젝션을 관리하는게 맞는것이겠지요 ?)

공통의 PublicDao를 두고서 공통 Dao에서 select, insert, delete, update, StartTransection(), end......()....등의 메서드를 두고

Logic에서 하나의 PublicDao를 호출해서 사용하는 방식과.

 

PublicDao와 같은 기능이 있는(select, insert, delete, update, StartTransection(), end......()....등의)

 Super 클래스를 두고

해당 클래스에 SqlMapClient를 싱글톤으로 생성한후에

각각의 Dao에서 Super를 상속받아서 사용하는 방식으로 구현하는것이 맞는것일까요 ??

답변 부탁드립니다.

 

이 글에 대한 댓글이 총 2건 있습니다.

Ibatis는

SqlMapClient는 스레드 세이프로 만들어져있고

싱글톤으로 하나만 만들어 사용하는것으로 나와있고

하나의 스레드에 대해서 트렌젝션을 수행한다고 알고 있습니다.

예를들어

sqlMap.startTransaction()을 걸면 호출한 스레드가 트렌젝션처리를 위한 유일한 컨넥션 개체를 갖고 있고

sqlMap.update("aa.upd", vo);

sqlMap.insert("aa.insert", vo);

sqlMap.endTransaction()

을 걸면 connetcion의 commit및 반환을 수행한다고 나와있는데

 하나인 SqlMapClient클래스에 여러객체에서 동시에 DB작업을 요청할텐데

각각 요청에대해서 startTransaction()시 스레드별로 컨넥션을별도로 할당및 기억하고 있고 그 기억을 바탕으로 트렌젝션을 수행한다고 생각하면 될까요 ?

-- 답변

네 맞습니다.

커넥션 하나에서 트랜젝선 하나를 관리 한다고 보시면 됩니다. 

endTransaction() 호출리 커밋이 호출 되는지는 모르겠지만 endTransaction()하기전에 commit or rollback을 해주는것이 정확합니다.

 

그리고 그 스레드라는 범위에 대해서는

웹페이지에 하나의 Request에대해 하나의 스레드라고 생각해도 무방하겠습니까 ?

예를들어 Spring 하고 같이 사용한다고 하면

aaa.do라는 웹주소로 요청(Request)이 들어왔다면

해당 요청에 대해 하나의 스레드가 생성되고 그 스레드에 대해 Ibatis는 startTransaction()시에 트렌젝션을 수행한다고 봐야되겠지요 ?

-- 답변

네 맞습니다.

정확하게 하자면 Request요청시에도 job이 할당이 안된 thread가 request를 받습니다.

ibatis에서도 마찬가지입니다.

 

또한 설계패턴에서

Logic에서 트렌젝션을 관리한다고 하면(원래는 Dao에서 트렌젝션을 관리하는게 맞는것이겠지요 ?)

-- 답변

질문의 의미가 애매모호 합니다.

트랜잭선 관리는 DBMS에서 관리를 합니다.

하지만 DBMS로 하나의 비지니스로직 트랜잭션을 감당 못할때가 있습니다.

그런경우 로직으로 처리를 합니다.

DAO에서 관리한다는 말씀은 endTransaction(), startTransaction()를 호출 하는걸 말씀하시는 거라면 DBMS에서 관리를 하는걸로 보셔도 될듯 합니다.

 

공통의 PublicDao를 두고서 공통 Dao에서 select, insert, delete, update, StartTransection(), end......()....등의 메서드를 두고

Logic에서 하나의 PublicDao를 호출해서 사용하는 방식과.

 

PublicDao와 같은 기능이 있는(select, insert, delete, update, StartTransection(), end......()....등의)

 Super 클래스를 두고

해당 클래스에 SqlMapClient를 싱글톤으로 생성한후에

각각의 Dao에서 Super를 상속받아서 사용하는 방식으로 구현하는것이 맞는것일까요 ??

답변 부탁드립니다.

-- 답변

두가지다 어떤방법이 맞다고 하기 어렵습니다.

select, insert, delete, update는 각 사용하는 Dao에서 재정의가 이루어져야 할부분으로 보입니다.

StartTransection(), end......()....의 경우는 기능이 똑같다고 봐도 무방할듯 합니다.

abstract 클래스 구현이 맞다고보여집니다.

추상화 클래스를 통하여 select, insert, delete, update abstract 메소드를 생성해주시고

StartTransection(), end......().... 메소드는 기능을 구현하여

각각  Dao에서 상속받아 사용하시면 될듯합니다.

자바사랑님이 2011-05-13 13:42에 작성한 댓글입니다.
이 댓글은 2011-05-13 13:48에 마지막으로 수정되었습니다. Edit

상세한 답변 감사합니다.

자바사랑님 말씀대로 commitTransaction() 이 빠졌네요 ..

넷에서 ibatis에 대한 자료를 찾아보면 기초적인 사용법이나 단편적인 내용들밖에 없어서

공통작업및 패턴을 설계할때 맘에 걸리던것이 많았는데 한번에 해결됬습니다. ^^

윤명철님이 2011-05-14 04:58에 작성한 댓글입니다.
이 댓글은 2011-05-14 05:07에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38552올백업 exp가 안되요.... [2]
한상원
2011-05-16
3276
38551쿼리 질문이요 ㅠㅠ [3]
궁금타
2011-05-13
3761
38550시간 정보가 들어 있는 두 칼럼의 몇 분 차이를 알고 싶습니다. [2]
초보
2011-05-12
4007
38549Ibatis에서 트렌젝션의 범위가 명확하지 않습니다. [2]
윤명철
2011-05-12
4613
38548다중컬럼 update시.... [1]
힘들어요
2011-05-12
4064
38547UNDO가 항상 90%이상에서 안떨어지면?
궁금이
2011-05-12
3054
38546rman backup 옵션? [1]
이재영
2011-05-09
3276
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다