2011-03-09 9 views
3

긴 작업 (예 : 10 초)을 수행하는 일부 재생 작업이 있습니다.프레임 워크 장기 실행 작업

DB 트랜잭션이 필요한 작업과 그렇지 않은 작업이 있습니다.

전체 작업이 단일 트랜잭션이므로 DB 트랜잭션을 오래 열어두기 때문에 좋은 방법은 아닙니다.

작업을 여러 트랜잭션으로 나누는 가장 좋은 방법은 무엇입니까? JPAPlugin closeTx를 사용하고 나서 startTx를 사용해야합니까?

답변

5

장기 실행 db 쿼리가 그렇게 나쁜 것 같지는 않습니다. 그러나 나쁜 점은 http 스레드가이 시간 동안 다른 스레드를 차단한다는 것입니다.

그러므로 Futures를 살펴보고 suspend 메소드를 사용하여 http 요청을 무료로 할 수 있도록 제안하고 앞으로의 작업이 다른 수신을 차단하지 않고 일정한 간격으로 완료되었는지 확인할 수 있습니다 http 요청.

또한 Play 1.2 (곧 베타 버전에서 사용할 수 있어야 함)에서는 FutureTasks에 대한 지원이 훨씬 뛰어나고 브라우저에 대한 응답이 지연됩니다.

+1

재생 1.2 브라우저에 대한 지연 응답이 짧은 시간 동안 메인 스레드를 해제 작업이 실행되는 동안 하나의 무거운 작업이 나머지 프로그램과 충돌하는 것을 방지합니다. Jobs는 몇 초가 걸리는 작업에 실제로 사용되어서는 안됩니다. –

1

by job 나는 HTTP 요청이 아닌 Job을 의미한다고 가정합니다.

긴 작업을 트리거하는 데 요청을 사용하는 경우 작업을 동기식 및 비동기식 파트로 분리하여 사용자에게 신속하게 돌아가서 (요청 트랜잭션을 닫음) 비동기 파트 (Job or Future를 통해) 나머지 부분을 처리 할 것입니다. 비동기 작업이 실패 할 경우를 대비하여 보상 코드가 필요할 수도 있지만 괜찮습니다.

비동기 작업이 오래 걸리고 많은 항목을 사용하는 경우 작은 작업으로 나누십시오. 테이블에 저장된 작업 대기열과 몇 초마다 실행되는 작업을 수행하고 첫 번째 작업 만 수행하십시오. 그렇게하면 긴 트랜잭션과 관련된 문제가 발생하지 않습니다. 당신이 다음 :) 걱정에 아무 소용이없는 작업을 분리 할 수 ​​없습니다 (가능성,하지만 일어날 수있는) 경우

관련 문제