2011-11-24 4 views
1

나는이 문제가있는 첫 번째 것이 아닐 수도 있다고 생각합니다. 가끔씩 사용자가 서버에 많은 데이터를 제출하면이 데이터 이 응답 페이지에 표시됩니다. 사용자에게 환상을주기 위해 데이터 제출 및 프로세스가 빠릅니다. 일반적으로이 작업은 비동기 적으로 수행됩니다. 이제 문제는 어떤 이유로 데이터가 데이터베이스에 먼저 들어가야하고 이며 응답 페이지에 나타나도록 가져와야합니다. 응답 페이지가 너무 빠르게 사용자에게 으로 표시되면 비동기 전송이 완료되지 않을 수 있습니다. 지금 전화 :ejb에서 잠시 동안 프로세스 실행 일시 중지

Thread.sleep();

내가 setResponsePage()를 호출하기 전에.

하지만 원시 스레드는 EJB에서 권장되지 않습니다. 누구든지 대안을 알고 있습니까? 감사합니다

답변

0

그냥이 질문에서 논의되었습니다 : Thread.sleep() in an EJB.

나는 논리를 두 개의 EJB로 분리했다 : 하나는 DB에 사용자 데이터를 삽입하기위한 것이고 다른 하나는 그것을 가져 오기위한 것이다. 귀하의 웹 계층은 차례로 하나씩 호출하여 데이터베이스에 의해 적절하게 정렬되어야하는 두 개의 분리 된 트랜잭션을 발생시킵니다 (여전히 트랜잭션 격리와 같은 다른 요인에 따라 달라질 수 있음).

편집

sleep()의 문제는 거의 항상 나쁜 생각, 그래서 당신이 기다리는 시간을 결코 알지 못할 것입니다. 여기 Ajax 푸시에 대한 사례가 표시됩니다. — 처리가 완료되면 데이터가 푸시 될 페이지가 즉시 반환되어야합니다. 나는이 분야에 대한 전문 지식이 아니기 때문에이 주제에 관해 더 이상의 조언을하지 않을 것입니다.

sleep()보다 여전히 불완전하지만 데이터베이스 잠금에 동기화 될 수 있습니다. 첫 번째 EJB는 데이터를 삽입하고 트랜잭션에서 일부 레코드를 잠그고 두 번째 EJB는 동일한 레코드를 잠그고 데이터를 읽으려고합니다. 이렇게하면 두 번째 EJB가 필요한 최소한의 시간 동안 대기하게됩니다.

+0

로직을 2 개의 트랜잭션으로 분리하고 적절하게 정렬하는 것이 좋습니다. 문제는 삽입하는 데 꽤 오랜 시간이 걸릴 수 있다는 것입니다. 예를 들어 여러 크기의 복사본을 클라우드에 업로드하는 동안 이미지의 메타 데이터를 데이터베이스에 삽입합니다. 그래도이 작업을 DB 업데이트 및 이미지 업로드의 두 단계로 구분할 수 있습니다. org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils.mixinAsync()를 지원하는 EJB 3.0을 사용하고 있습니다. 비동기 프록시를 통해 호출 될 때 작업이 얼마나 빨리 수행되는지는 알 수 없습니다. 따라서 합리적인 기간 동안 프로세스를 일시 중지해야합니다. – Wangge

+0

@Wangge 답변을 확장했습니다. – MaDa

관련 문제