아핫뉴스실시간 인기검색어
아핫뉴스 화산 이미지
아하

생활

생활꿀팁

하얀고슴도치236
하얀고슴도치236

MyBatis 에서 defaultExecutorType 마다 차이가 무엇인가요??

MyBatis 에서 defaultExecutorType 마다 차이가 무엇인가요??

간단하게 SIMPLE, REUSE, BATCH 3개가 있는것으로 보이는데...

보통 SIMPLE 로 사용하고 간혹 BATCH 를 사용하는 프로젝트가 있는것 같습니다.

BATCH 인 경우 INSERT / UPDATE 등을 Int Type 으로 반환시 -2147482646 등으로 return 되는 등 차이가 조금씩 있는것같은데 각각의 차이점은 무엇인지 궁금합니다.

    55글자 더 채워주세요.
    1개의 답변이 있어요!
    • 나의탄생
      나의탄생

      해당 옵션은 여러건의 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 = 1

      REUSE : 동일한 쿼리에 대해 한번만 컴파일 + 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 = 1

      BATCH : 동일한 쿼리에 대해 한번만 컴파일 + db connection 한번으로 여러건의 insert/update를 처리한다.

      - 동일한 쿼리에 대해 한번만 컴파일 = 한번 컴파일을 진행하고 캐시에 저장 후 동일한 sql을 실행하면 캐시에서 찾아서 사용한다.

      - db connection = 여러개의 sql문에 대해 하나의 db connection에서 처리(batch)

      - 결과값 = 한번의 db 연결로 여러개의 쿼리문을 실행하므로 결과값을 알 수 없다. (-2147482646 리턴)

      왜 -2147482646 인지 궁금해서 찾아봤는데요 mybatis 개발자가 그냥 상수로 정의해 놓았네요
      (https://mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/executor/BatchExecutor.html#BATCH_UPDATE_RETURN_VALUE)

      [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