환경 : Springframework 3.1.1 Release, Oracle 11g Database, JDK 1.8, mybatis

오류 발생 상황:
대량 text 파일 데이터 (약 118만 row)를 read 후 database insert 테스트 시 종종 일정 개수만 insert 후 더 이상 진행 불가 현상 발생. lock 확인 해 보니 v$session 테이블의 WAIT_CLASS 컬럼에 Concurrency가 찍혀있었고, v$session_blockers테이블의 WAIT_EVENT_TEXT 컬럼에 library cache: mutex X 가 찍힘.

원인 : 다양한 원인이 있으나 Bulk insert로 진행하더라도 (3000건씩 insert 하도록 했었음) 394번이 넘는 insert를 해야해서 Hard Pasing쪽이 큰 원인으로 판단

해결 : 일반 sqlSessionTemplate에서 진행하지 않고, insertBatch를 활용하여 insert.
          applicationContext.xml에 Batch로 진행할 sqlSessionTemplate bean을 하나 더 생성해준 후 Executortype을 BATCH로 설정. service 단에서 batch템플릿을 injection 후 
         sqlSessionTemplateBatch(내가 설정한 변수명).insert("mapper의 namespace.메소드명", insert파라미터); 
        그리고 파일 1개당 batch flush를 해주기 위해 파일 하나가 끝날 때마다 sqlSessionTemplateBatch.flushStatements();호출
 batch insert 실행 시 10만건에 3~4초 시간 소요.

Posted by 知彼知己百戰不殆
,