본문 바로가기
프로그래밍/SPRING

[SPRING] 대량 Insert : mybatis foreach vs sqlSession batch

by 두둠칫 2022. 8. 2.

0. insert 조건

 - 최대 10만건

 - 결과 : mybatis foreach보다 sqlSession batch 빠름(본인환경에서는 4배 이상)

 

1. mybatis foreach

 - INSERT ALL

 - INSERT INTO ~ UNION ALL

(INSERT INTO ~ UNION ALL이 더 빠름)

 

 - foreach문으로 가져올 parameter는 서버의 파일에서 line으로 읽어 line만큼 Map instance를 생성해야하는 구조였기 때문에 heap memory 부하가 생겨 선택X

SqlSession sqlSession;

...

HashMap<String, Object> pMap = new HashMap<String, Object>();
pMap.put("p1", p1);
pMap.put("p2", p2);
...

List<String, HashMap<String, String>> arr = new ArrayList<String, HashMap<String, String>>();
HashMap<String, String> map = new HashMap<String, String>();

int sqlSize = 0;
int batchSize = 1000;
while(p3 = inFile.readLine()){ // 서버에서 파일을 읽어서 가져와야하는 p3
	
    map = new HashMap<String, String>();
    // arr에 넣는 것은 참조 값이기 때문에 새로운 instance를 생성해서 넣지 않는다면
    // 결국 마지막으로 읽어온 p3값만 참조하는 arr가 되버린다.
    // 하지만 그걸 피해서 insert건수마다 instance를 생성하면 memeory 부하 발생
    
    map.put("p3", p3);
    
    ...
    
    arr.add(map);
    sqlSize++;
    
    if(sqlSize%batchSize==0){
    	pMap.put("p3List", arr);
    	sqlSession.insert("queryId", pMap); // insert all or union all
    }
}
sqlSession.insert("queryId", pMap); // 나머지

 

2. sqlSession

 - ExecutorType.BATCH

 - insert

 - 1000건마다 sqlSession.flushStatements()

 - 메모리 부하 없이 속도도 가장 빠름

SqlSession sqlSession;// set ExecutorType.BATCH

...

HashMap<String, Object> pMap = new HashMap<String, Object>();
pMap.put("p1", p1);
pMap.put("p2", p2);
...

int sqlSize = 0;
int batchSize = 1000;
while(p3 = inFile.readLine()){ // 서버에서 파일을 읽어서 가져와야하는 p3
	
    pMap.put("p3", p3);
    
    sqlSession.insert("queryId", pMap); // insert 단건
    sqlSize++;
    
    if(sqlSize%batchSize==0){
    	sqlSession.flushStatements(); // flush 할때만 session 생성 -> 속도향상
    }
}
sqlSession.flushStatements(); // 나머지
...

'프로그래밍 > SPRING' 카테고리의 다른 글

[SPRING] RestTemplate, SSL, TLS, Proxy(+UrlConnection, HttpClient, WebClient)  (0) 2022.09.19
JPA 관련 정리  (0) 2022.06.01
한끝완3  (0) 2022.05.27
한끝완2  (0) 2022.05.23
한끝완1  (0) 2022.02.20