환경 : 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초 시간 소요.
'프레임워크 > SpringFramework' 카테고리의 다른 글
ThreadPool을 이용한 동시성 처리 (0) | 2025.02.07 |
---|---|
SpringFramework applicationContext.xml 을 활용한 multi DB 연결 (0) | 2025.02.07 |
Transaction propogation과 DB for update wait 삽질 (0) | 2024.05.31 |
SQL 로그 출력 셋팅 시 오류 문제. (0) | 2021.08.29 |
thymeleaf 웹 페이지 오류 (0) | 2021.08.16 |