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(); // 나머지
...