2017-12-18 18 views
5

80,000 개가 넘는 레코드의 대량 처리 (데이터베이스에서 레코드 업데이트 또는 새 레코드 만들기)를 수행하는 SQL Server와 통신하는 Grails 서비스가 있습니다. 이 프로세스가 진행되는 동안 이러한 레코드는이 프로세스에 의해 잠겨 있습니다. 다른 사람이 개별적으로 레코드를 업데이트하려고하면 해당 레코드를 기다리는 동안 시간이 초과됩니다. 일괄 처리 중에 레코드를 쿼리하고 업데이트하는 방법? 그런 식으로 막히지 않습니까?테이블에 잠금 장치가있는 Grails 대량 처리

나는 flush : true를 사용해 보았지만 도움이되지 않았다.

답변

4

flush=true은 로컬 하이버 네이트 세션의 데이터를 데이터베이스에 기록하므로 자신과 같은 대규모 대량 작업을 위해 응용 프로그램 서버의 메모리 문제를 피하는 것이 중요하지만 데이터베이스가 행을 잠그는 방식에는 영향을 미치지 않습니다.

변경해야 할 사항은 거래 경계입니다. 행이 모두 동일한 트랜잭션에 있고, 아마도 원하지 않거나 (또는 ​​데이터베이스에 대해 효율적이기 때문에) 행이 모두 잠금 상태입니다. 모든 행을 잠글 필요가있는 이유가없는 한, 서비스를 무국적으로 만들 수 있습니다. 그런 다음 각 행은 자체 트랜잭션에서 업데이트되고 잠시 잠긴 것입니다. 그러나 이것은 훨씬 느릴 수 있습니다.

중급의 경우 서비스를 static transactional=false으로 설정 한 다음 .withTransaction {...} 클로저와 루프를 사용하여 한 번에 특정 수의 행을 수행하는 것이 좋습니다.

이 문서는 오래된 문서이지만 읽어야하는 유용한 정보가 있습니다.이 정보는 필자가 언급 한 코드 예제를 제공합니다. http://sacharya.com/transactions-in-grails/

+0

GORM MongoDB와 비슷한 문제가 있습니다. GORM MongoDB에 sessionFactory bean이 존재하지 않는 것 같습니다. GORM MongoDB 세션을 플러시하고 지우는 방법을 알고 계십니까? – unekwu

관련 문제