2013-06-18 5 views
0

두 가지 스프링 배치 작업이 있습니다. 첫 번째 작업 (작업 A)은 CRM 시스템에서 데이터를 읽고 (웹 서비스를 통해) Oracle 데이터베이스 테이블에 씁니다. 두 번째 작업 (작업 B) - 바이스 (vise) - 동일한 Oracle 데이터베이스 테이블에서 데이터를 읽어 CRM (웹 서비스를 통해)으로 보냅니다. HibernateTemplate을 사용하여 데이터베이스 작업을 수행합니다. Oracle 데이터베이스 저장 및 업데이트 방법은 @Transactional (propagation = Propagation.REQUIRES_NEW)로 표시됩니다. 이러한 배치 작업은 동시에 작동합니다. 어떤 시점에서 두 작업이 서로 차단합니다. - 작업 Oracle 데이터베이스 블록에서 레코드를 읽는 동안 CRM에 데이터를 읽고 보내야하는 작업이 수행 할 수있는 작업은 수동으로 중지하는 것입니다.스프링 배치 작업이 동시에 데이터베이스 잠금에 액세스

나 최대 절전 모드 특히 익숙하지 않다 자원을 기다리는 동안 감지 된 교착 상태 : java.sql.SQLException의 : ORA-00060

Caused by: org.hibernate.exception.LockAcquisitionException: could not execute update query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:87) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:84) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:396) 
    at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:259) 
    at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1141) 
    at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:94) 
    at org.springframework.orm.hibernate3.HibernateTemplate$39.doInHibernate(HibernateTemplate.java:1150) 
    at org.springframework.orm.hibernate3.HibernateTemplate$39.doInHibernate(HibernateTemplate.java:1) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    ... 60 more 

에 의해 발생 : B 나중에 너무 정지 및 -job 예외가 발생합니다 그것은 봄과 함께 작동합니다. 내 이해는 Hibernate가 트랜잭션을 관리한다는 것이지만 분명히 틀렸다. 자물쇠가있는 이유는 어디에있을 수 있습니까? 내 최대 절전 모드 설정은 다음과 같습니다

<property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.cglib.use_reflection_optimizer">false</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.default_batch_fetch_size">0</prop> 
      <prop key="hibernate.cache.use_structured_entries">true</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
      <prop key="hibernate.use_sql_comments">true</prop> 
      <prop key="hibernate.jdbc.batch_size">0</prop> 
      <prop key="hibernate.jdbc.use_streams_for_binary">true</prop> 
      <prop key="hibernate.connection.useUnicode">true</prop> 
      <prop key="hibernate.connection.characterEncoding">UTF8</prop> 
      <prop key="hibernate.mapping.precedence">class</prop> 
      <prop key="hibernate.transaction.flush_before_completion">true</prop> 
      <prop key="hibernate.connection.release_mode">auto</prop> 
     </props> 
    </property> 
+0

Isolation_level은 무엇입니까? – Cygnusx1

+0

여기에 대한 좋은 링크입니다 : http://www.oratechinfo.co.uk/deadlocks.html#unindex_fk – Cygnusx1

+0

나는 기본 오라클 격리 레버 - 커밋 된 읽기를 사용합니다. – user2382219

답변

0

확인, 먼저이 교착 상태에 대한 오라클의 추적 로그를 찾을 수 있어야합니다. 교착 상태의 원인을 정확히 알 수 있습니다.

this thread

교착 상태가하고 트랜잭션 레벨에서 시도 설정 어떤 일이 일어날 수보세요! 아마도 배치의 논리와 병렬로 실행하면 더 많은 팔이 발생할 수 있다는 사실을 검토해야 할 것입니다.

당신의 경우, 작업 A와 작업 B는 아마도 Oracle 데이터베이스에서 동일한 레코드를 잠그기 위해 싸울 것입니다.

행운을 빕니다

관련 문제