MyBatis 에서 defaultExecutorType 마다 차이가 무엇인가요??
MyBatis 에서 defaultExecutorType 마다 차이가 무엇인가요??
간단하게 SIMPLE, REUSE, BATCH 3개가 있는것으로 보이는데...
보통 SIMPLE 로 사용하고 간혹 BATCH 를 사용하는 프로젝트가 있는것 같습니다.
BATCH 인 경우 INSERT / UPDATE 등을 Int Type 으로 반환시 -2147482646 등으로 return 되는 등 차이가 조금씩 있는것같은데 각각의 차이점은 무엇인지 궁금합니다.
해당 옵션은 여러건의 insert나 update시 이점을 가질 수 있는 옵션입니다.
인서트를 반복하여 저장하고 옵션에 대한 로그를 확인하면 아래와 같습니다.
https://araikuma.tistory.com/480 에 내용을 인용하였습니다.해당 문서 내용에 설명이 설정정보가 있으니 확인하시기 바랍니다.
SIMPLE : 실행시마다 쿼리에 대한 컴파일 + db connection 이 하나의 insert/update당 이루어진다.
- 실행시마다 쿼리에 대한 컴파일 = "insert into test_table (value) values (?) " 를 컴퓨터가 알 수 있는 형태로 변경 작업을 진행
- db connection = 쿼리마다 db에 연결하여 insert 작업을 진행하고 close 시킨다.
- 결과값으로 업데이트 된 row 수를 리턴한다. (만약 "update test_table set value = 1 where id in (1,2)" 라면 두개의 row가 업데이트 되므로 2를 리턴하게 된다.)
[DEBUG] s.m.insertTest - ==> Preparing: insert into test_table (value) values (?) [DEBUG] s.m.insertTest - ==> Parameters: value-0(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1 [DEBUG] s.m.insertTest - ==> Preparing: insert into test_table (value) values (?) [DEBUG] s.m.insertTest - ==> Parameters: value-1(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1 [DEBUG] s.m.insertTest - ==> Preparing: insert into test_table (value) values (?) [DEBUG] s.m.insertTest - ==> Parameters: value-2(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1REUSE : 동일한 쿼리에 대해 한번만 컴파일 + db connection 이 하나의 insert/update당 이루어진다.
- 동일한 쿼리에 대해 한번만 컴파일 = 한번 컴파일을 진행하고 캐시에 저장 후 동일한 sql을 실행하면 캐시에서 찾아서 사용한다.
- db connection = 쿼리마다 db에 연결하여 insert 작업을 진행하고 close 시킨다.
- 결과값으로 업데이트 된 row 수를 리턴한다.
[DEBUG] s.m.insertTest - ==> Preparing: insert into test_table (value) values (?) [DEBUG] s.m.insertTest - ==> Parameters: value-0(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1 [DEBUG] s.m.insertTest - ==> Parameters: value-1(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1 [DEBUG] s.m.insertTest - ==> Parameters: value-2(String) [DEBUG] s.m.insertTest - <== Updates: 1 updateCount = 1BATCH : 동일한 쿼리에 대해 한번만 컴파일 + db connection 한번으로 여러건의 insert/update를 처리한다.
- 동일한 쿼리에 대해 한번만 컴파일 = 한번 컴파일을 진행하고 캐시에 저장 후 동일한 sql을 실행하면 캐시에서 찾아서 사용한다.
- db connection = 여러개의 sql문에 대해 하나의 db connection에서 처리(batch)
- 결과값 = 한번의 db 연결로 여러개의 쿼리문을 실행하므로 결과값을 알 수 없다. (-2147482646 리턴)
왜 -2147482646 인지 궁금해서 찾아봤는데요 mybatis 개발자가 그냥 상수로 정의해 놓았네요
[DEBUG] s.m.insertTest - ==> Preparing: insert into test_table (value) values (?) [DEBUG] s.m.insertTest - ==> Parameters: value-0(String) updateCount = -2147482646 [DEBUG] s.m.insertTest - ==> Parameters: value-1(String) updateCount = -2147482646 [DEBUG] s.m.insertTest - ==> Parameters: value-2(String) updateCount = -2147482646
(https://mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/executor/BatchExecutor.html#BATCH_UPDATE_RETURN_VALUE)