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를 상속받아서 사용하는 방식으로 구현하는것이 맞는것일까요 ??
답변 부탁드립니다.
|