배치 템플릿 실행 오류
- 작성자 :
- 김*수
- 작성일 :
- 2013-08-01 16:49:16
- 조회수 :
- 1,746
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
수고하십니다.
egov Batch Template Project를 이용하여 웹에서 호출하는 배치 프로젝트를 만들고, DB를 오라클로 변경하여 실행하면 다음과 같은 오류거 나타납니다.
org.springframework.dao.CannotSerializeTransactionException: PreparedStatementCallback; SQL [INSERT INTO BATCH_JOB_EXECUTION_CONTEXT (SHORT_CONTEXT, SERIALIZED_CONTEXT, JOB_EXECUTION_ID) VALUES(?, ?, ?)]; ORA-08177: 이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다
; nested exception is java.sql.SQLException: ORA-08177: 이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다
무엇을 설정해야 하나요?
egov Batch Template Project를 이용하여 웹에서 호출하는 배치 프로젝트를 만들고, DB를 오라클로 변경하여 실행하면 다음과 같은 오류거 나타납니다.
org.springframework.dao.CannotSerializeTransactionException: PreparedStatementCallback; SQL [INSERT INTO BATCH_JOB_EXECUTION_CONTEXT (SHORT_CONTEXT, SERIALIZED_CONTEXT, JOB_EXECUTION_ID) VALUES(?, ?, ?)]; ORA-08177: 이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다
; nested exception is java.sql.SQLException: ORA-08177: 이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다
무엇을 설정해야 하나요?
A
안녕하세요. 김김수님.
여러 VM이 동시에 batch job을 실행시킬 때에 발생되는 오류 같습니다.
이 경우는 oracle의 특성 상 serializable transaction이 시작된 후 commit에 의해 수정된 데이터를 수정하거나 삭제할 때에 발생되는 상황입니다.
(Spring Batch의 repository 처리 방식은 기본적으로 serializable로 설정됨)
해결 방법은 context-batch-job-launcher.xml 상에 지정된 jobRepository bean 상에 다음과 같은 속성 값을 지정하시면 되실 것 같습니다.
<property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
p namespace를 사용하신 경우(현재 적용 방식)은 전체 다음과 같이 적용하시면 됩니다.
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"
p:lobHandler-ref="lobHandler"
p:isolationLevelForCreate="ISOLATION_DEFAULT" />
그럼, 즐거운 하루되십시오.
감사합니다.
여러 VM이 동시에 batch job을 실행시킬 때에 발생되는 오류 같습니다.
이 경우는 oracle의 특성 상 serializable transaction이 시작된 후 commit에 의해 수정된 데이터를 수정하거나 삭제할 때에 발생되는 상황입니다.
(Spring Batch의 repository 처리 방식은 기본적으로 serializable로 설정됨)
해결 방법은 context-batch-job-launcher.xml 상에 지정된 jobRepository bean 상에 다음과 같은 속성 값을 지정하시면 되실 것 같습니다.
<property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
p namespace를 사용하신 경우(현재 적용 방식)은 전체 다음과 같이 적용하시면 됩니다.
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"
p:lobHandler-ref="lobHandler"
p:isolationLevelForCreate="ISOLATION_DEFAULT" />
그럼, 즐거운 하루되십시오.
감사합니다.