2017-12-12 27 views
0

일] 적으로 50 개 이상의 u 리를 전송하는 일} 처리 batchUpdate를 호출 할 때마다 각 갱신 조회가 잠재적으로 10,000 개의 레코드를 갱신 할 수 있습니다. 이 전체 프로세스는 시간이 걸리고 결국 트랜잭션 시간 초과 예외로 실패합니다. springContext.xml에 정의 된 데이터 소스가 @Qualifier를 통해 JdbcTemplate에 삽입되고 springContext.xml에 정의 된 트랜잭션 시간 초과가 전체 애플리케이션에 적용될 수 있지만이 특정 트랜잭션에서는 트랜잭션 시간 초과를 무시하고 싶습니다. batchUpdate 메소드를 호출하기 전에 값.batchUpdate 동안 Spring JDBCTemplate에 대한 트랜잭션 시간 초과 값을 오버라이드하는 방법

@Qualifier("myDataSource") 
    @Autowired 
    public void setDataSource(DataSource ds) { 
    this.jdbc = new JdbcTemplate(ds); 
    jdbc.setFetchSize(10000); 
    jdbc.setQueryTimeout(0); // zero means there is no limit 
    } 

    //I want to set custom transaction timeout before calling this from some other methods. 
    jdbc.batchUpdate(queries.toArray(new String[0])); 

답변

1

주석을 사용하여 시간 제한을 지정하십시오.

@org.springframework.transaction.annotation.Transactional(timeout = 123) // 123 sec 

Here은 참조 문서입니다.

+0

당신이 jdbc.batchUpdate (queries.toArray (new String [0]));를 호출하는 메소드 맨 위에 있다는 것을 의미합니까? 현재이 메소드는 @Transactional annotation으로 표시되어 있지 않지만 전체 batchUpdate가 트랜잭션에서 실행되고 있습니다. – user1614862

+0

5 분 (300 초) 동안 설정 한 후에도 여전히 트랜잭션 타임 아웃이 발생합니다. 문제는 트랜잭션에 select 쿼리 행이 선택되어 있기 때문에 교착 상태가 발생하는 것 같습니다. SELECT 쿼리를 시도했습니다. 내 select 쿼리가 집계 함수를 가지고 있기 때문에 UPDATE도 작동하지 않았습니다. 선택 중에 행을 잠글 수 없도록 내 트랜잭션에 알리는 다른 방법이 있습니까? – user1614862