public void save(List<Entity> entities) throws SQLException {

    try (

        Connection connection = database.getConnection(); // db 연결 파라미터 rewriteBatchedStatements=true 는 필수다

        PreparedStatement statement = connection.prepareStatement(SQL_INSERT);

    ) {

        int i = 0;


        for (Entity entity : entities) {

            statement.setString(1, entity.getSomeProperty());

            // ...


            statement.addBatch();

            i++;


            if (i % 5000 == 0 || i == entities.size()) {

                statement.executeBatch(); // 5000건 당 배치 실행

            }

        }

    }

}



한번 DBMS 호출에 여러 건의 DATA를 처리하는 방법으로 프로그램에서 다량 건 처리 시 db 호출 횟수를 획기적으로 줄여 

시스템 overhead 감소. 


약 10~15배 성능 향상 가능

https://downloads.mariadb.com/MariaDB/mariadb-10.2.4/winx64-packages/


10.1.22가 안정화된 버전이라고 하는데... CTE를 써보기 위해 최신 버전을 설치했다.


입력사항은 별 특별한게 없어서... 임의로 입력함. ㅋ






이런 데이터가 바로 계층형 데이터. 


흔히 말하는 사원 테이블이다. 


오라클과 달리 계층형 질의(SQL)를 지원하지 않는다. 

오라클이었으면 START WITH CONNECT BY 로 끝장을 냈을텐데 말이다. 



MySQL을 거의 안써본 입장에서 여기저기 찾아보고 테스트해보고 만든 SQL은 다음과 같다.




SELECT @R AS _ID,

(

SELECT @R:= MANAGER_ID       ---@R 에 해당하는 EMP_NO의 MANAGER_ID를 가져오면서 @R을 MANAGER_ID로 갱신함

 FROM ENC_EMP 

WHERE EMP_NO = _ID

) AS _MANAGER_ID                          

, @L:=@L+1 AS LEVEL                      --- 계층레벨 표시

FROM ( SELECT @R:=102) VARS          --- 시작할 하위 데이터의 EMP_NO를 지정

, ENC_EMP H

, (SELECT @L:=0) LV          --- 계층레벨 초기화(초기화하지 않으면 NULL이므로 안나온다)

  WHERE @R <> 0


MySQL은 세션변수를 많이 활용하나보다. @ 붙은 변수가 세션변수(해당 세션에서만 임의로 정의하여 쓰는 듯)이고 

위 SQL에서는 @R은 MANAGER_ID 와 EMP_NO를 연결하기 위해 _ID 라는 ALIAS로 임의로 사용



결과는 이렇게 나온다. 




+ Recent posts