nhkiiim / TIL

Today I Learned
https://github.com/nhkiiim/TIL/discussions
1 stars 0 forks source link

PreparedStatement addBatch() / MyBatis foreach #185

Open nhkiiim opened 1 year ago

nhkiiim commented 1 year ago

PreparedStatement addBatch() / MyBatis foreach

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

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

관련 개념 #109

nhkiiim commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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

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