아핫뉴스실시간 인기검색어
아핫뉴스 화산 이미지
화산 아이콘 11
트럼프-파월 갈등 속 비트코인
많이 본
아하

생활

생활꿀팁

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

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

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

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

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

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

    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