@Transactional이 달린 메소드에 loop로 insert하는 부분이 batch insert(bulk insert)처럼 동작하는데 왜그런것인가요?

644 views
Skip to first unread message

StyLe_jG

unread,
Aug 28, 2015, 1:21:36 AM8/28/15
to Korea Spring User Group Q&A
이번에 mybatis를 이용해서 디비에 데이터를 insert 하는 부분을 작성하고 있는데요.


public void insertList(List<Map<String, String>> list) {
for(Map<String, String> map : list) {
mapper.insertMap(map);
}
}

위의 메소드를 이용하여 200건의 데이터를 입력을 하면 3000ms정도 걸리는데요, 여기에 트랜잭션을 걸고 싶어 insertList메소드에 @Transactional 어노테이션을 걸면 속도가 200ms로 끝나버립니다.

로그를 보면 어노테이션이 안 붙어있을땐
쿼리
파라미터
쿼리
파라미터

형식으로 찍혀 한건한건 처리되고 커밋되는것처럼 보이는데, 어노테이션을 붙이면

쿼리
파라미터
파라미터
파라미터
파라미터
.....

로 찍히면서 마지 Mybatis의 batch 처럼 동작을 하게 되는데요, 

왜 이렇게 동작하는것일까요? 
처음에 제가 생각한 것은Transactional을 붙여주면 더 느려질것 같다 라는게 제 생각이었는데, 완전히 다른 결과가 나와버리니 신기하기도 하고 이상하기도 하고 하네요~^^;;



StyLe_jG

unread,
Aug 28, 2015, 2:50:09 AM8/28/15
to Korea Spring User Group Q&A
보다보니까
<bean id="sqlSessionBatchTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
        <constructor-arg index="1" value="BATCH" />
    </bean>

이 빈을 등록하면 @Transactional시 batch로 처리하고 
해당 빈이 등록되어있지 않으면 한건한건씩 처리하네요~

2015년 8월 28일 금요일 오후 2시 21분 36초 UTC+9, StyLe_jG 님의 말:

Jisung Ahn

unread,
Sep 3, 2015, 5:02:29 AM9/3/15
to ks...@googlegroups.com
Transaction을 시작하면 트랜잭션 내에서는 하나의 커넥션을 재사용합니다. 
Transaction을 시작하지 않으면 매 쿼리마다 커넥션을 가져와서 사용하게 됩니다. 

spring batch에서는 Transaction을 할 아이템 갯수를 지정할수 있는 기능이 있습니다. 

2015년 8월 28일 오후 3:50, StyLe_jG <cresp...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/ba5c7224-66e5-4d0d-aac3-8b92c48209f4%40googlegroups.com을(를) 방문하세요.

더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

Reply all
Reply to author
Forward
0 new messages