Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PreparedStatement addBatch() / MyBatis foreach #185

Open
nhkiiim opened this issue Apr 20, 2023 · 3 comments
Open

PreparedStatement addBatch() / MyBatis foreach #185

nhkiiim opened this issue Apr 20, 2023 · 3 comments

Comments

@nhkiiim
Copy link
Owner

nhkiiim commented Apr 20, 2023

PreparedStatement addBatch() / MyBatis foreach

프로프레임 -> 스프링 전환 사전 분석 과정에서 addBath(), executeBatch()를 마이바티스 Mapper 인터페이스로 변환하면서 마이바티스의 foreach 사용

처리량이 많아 addBath()후 나누어서 executeBatch()를 수행하는 상황은 아니었고, 한번의 executeBatch()만 수행, 자세한 데이터 처리량 확인 필요

관련 개념 #109

@nhkiiim
Copy link
Owner Author

nhkiiim commented Apr 20, 2023

PreparedStatement addBatch()

https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#addBatch(java.lang.String)

  • PreparedStatement에서 제공하는 addBatch()를 활용하면 쿼리를 실행하지 않고 쿼리 구문을 메모리에 올려두었다가 executeBatch() 시 한번에 배치로 실행 가능
while(...) {
...
// addBatch에 담기
pstmt.addBatch();

// 파라미터 Clear
pstmt.clearParameters() ;

  // 건수를 나눠서 건 단위로 커밋
  if ( (i % 10000) == 0){
  
      // Batch 실행
      pstmt.executeBatch() ;
      
      // Batch 초기화
      pstmt.clearBatch();
      
      // 커밋
      con.commit() ;
  }

}

addBatch 대용량 데이터 처리 참고 : https://fruitdev.tistory.com/111

@nhkiiim
Copy link
Owner Author

nhkiiim commented Apr 20, 2023

MyBatis foreach

https://mybatis.org/mybatis-3/ko/dynamic-sql.html#foreach

  • 파라미터를 Collection으로 받아 반목문 형태로 쿼리 작성 가능

오라클 PL/SQL과 foreach를 활용해 적용

<update id="update" parameterType="java.util.List">
    <foreach collection="list" item="dto" open="DECLARE BEGIN" separator=";" close="END;">
        UPDATE [테이블명]
        name = #{dto.name}
        WHERE BLD_ID = #{dto.bldId}
          AND OP_DT = #{dto.optDt}
          AND OP_SEQ = #{dto.opSeq}
    </foreach>
</update>

<foreach> 속성

  • collection : 전달 받은 인자를 속성 값으로 삽입, Map, Array, List, Set 등과 같은 반복 가능한 객체를 전달 가능
  • item : collection 속성에서 전달 받은 객체 이름 지정
  • open : 구문 시작 시 삽일 할 문자열
  • close : 구문 종료 시 삽일 할 문자열
  • separator : 반복되는 구문 사이에 삽일 할 문자열
  • index : index값 이름 지정

@nhkiiim
Copy link
Owner Author

nhkiiim commented Apr 20, 2023

오라클 PL/SQL 참고 : https://tantangerine.tistory.com/189

MyBatis에서 Batch처리 - SqlSession과 foreach 비교 : https://yookeun.github.io/java/2015/06/19/mybatis-batch/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant