IT'S DO
728x90

프론트에서 Json Array로 다량의 데이터를 받아 데이터를 update 한다고 하면

아래와 같이 dynamaic query를 활용할 수 있습니다.

 

1.

<update id="dynamicUpdate" parameterType="HashMap">
    <foreach item="item" collection="배열이 들어있는 맵의 키" open="DECLARE BEGIN" close=";END;" separator=";">
        UPDATE 테이블명
           SET 컬럼 = #{item.column}
         WHERE 테이블키 = #{item.key} 
    </foreach>
</update>

 

2. 

@Service("business")
public class business{
    private PreparedStatement pstmt;
    private Connection con;
    
    @Transactional
    public void testLogic(Map<String, Object> map) throws Exception{
        con = null;
        pstmt = null;
        String sql = "UPDATE 테이블명 SET 컬럼 = ? WHERE 테이블키 = ?";
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@ip:port/sid","id","pw");
            pstmt = con.prepareStatement(sql);
            
            /*json to list*/
            List<Map<String, Object>> list = CmmnVar.GSON.fromJson(map.get("data").toString(), ArrayList.class);
            for(int i=0, n=list.size(); i<n; i++){
                pstmt.setString(1, list.get(i).get("param1").toString));
                pstmt.setString(2, list.get(i).get("param2").toString));
                pstmt.addBatch();
                pastmt.clearParameters();
                
                /*100개 마다 commit*/
                if((i%100) == 0){
                    pstmt.executeBatch();
                    pstmt.clearBatch();
                    con.commit();
                }
            }
            pstmt.executeBatch();
            con.commit();
        }catch(Exception e){
            con.rollback();
        }finally{
            if(pstmt != null) pstmt.close();
            if(con != null) con.close();
        }
    }
}

 

 

DB 커넥션 정보를 따로 설정하고, 전달받은 데이터를 반복문을 돌면서 100개마다 커밋을 하는 방식입니다.

500개 데이터로 체크해봤을 때 dynamic query를 사용했을 때보다 0.3초 정도 빠른것으로 확인됐습니다.

데이터가 많아질 수록 차이도 커지겠죠.

 

다량의 데이터를 처리할 때는 batch 방식을 사용하도록 합시다!

 

https://aljjabaegi.tistory.com/577

 

Java 대용량 데이터 DB 처리 방법, batch

Java 대용량 데이터 DB 처리 방법, batch 많은 양의 데이터를 insert 하거나 update 해야 할 때 mybstis dynamic query를 사용하게 되면 메모리 에러가 발생할 수 있습니다. 이럴 때 사용할 수 있는 방법이 batch

aljjabaegi.tistory.com

 

profile

IT'S DO

@멋진놈

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!