2013-06-18 3 views
4

현재 일종의 작업을위한 JPA 엔티티가 있습니다. 일부 프로세스는 해당 테이블에 쓰고 예약 된 프로세스는 해당 작업을 수행하고 준비가되면 상태를 변경합니다. 작업 우선 순위를 정하고 실패 할 경우 빈도를 줄이려면 다시 시도해야합니다. 저의 환경은 Hibernate + MySQL + XA 트랜잭션을 통한 GlassFish 3 + JPA입니다. 중기 적으로 프로젝트는 GlassFish를 Spring 솔루션 (Jetty 정도 사용)으로 대체합니다.JPA를 사용하여 생산자 - 소비자를 작성하는 방법

어떻게 든이 작업이 이루어졌지만 실제로는 만족스럽지 않습니다. OptimisticLockExceptions을 얻었습니다. 일부 시점에서 제대로 트랜잭션을 처리하지 못했고, GlassFish의 JPA 타이머도 다소 엉망입니다. 당신은 가변 시간이 필요합니다.

나는 잘못된 도구를 사용하고 있으며, 성숙하고 안정적인 디자인을 사용해야한다고 말했습니다. JPA 엔티티를 사용하는 것이 무거운 것처럼 보이지만 원시 JDBC는 더 나쁜 선택처럼 보입니다. 물론 나는 무거운 라이브러리 의존성을 피하고 싶지만 어쩌면 내 특유의 문제에 대한 간단한 "통조림"솔루션을 간과 할 수있다.

[편집]

명확히하기 위해 : 나는 유스 케이스가 변경되지 않습니다 (심지어 더 이상 코드가없는), 난 그냥 "그것을하기 위해 몇 가지 일반적인 지침을 얻으려면 다음 번에 "오른쪽"(TM)을 누르십시오. ben75의 질문에 대답하려면 : 직원이 멀티 스레드 일 수도 있고, 작은 트랜잭션이 필요할 수도 있습니다.

+0

작업자 프로세스가 단일 스레드입니까? 우선 순위를 정하는 사람 (작업자 또는 생산자 또는 ...)? 언제 당신이 그 OptimisticLocking (작업 실행의 끝에서 또는 ...)받을 수 있습니까? 한 작업의 전체 실행 중에 하나의 단일 트랜잭션이 있습니까? – ben75

답변

1

난 그냥 위의 것들을 프로세스에서 역할을 식별하기 위해 볼 필요가 있다고 생각합니다 & 작업의 생성자, 작업의 프로세서와 우선 순위 컨트롤러 간의 종속성을 감지 . 그 후에 이러한 모든 역할에 대한 디자인은 재사용 가능한 EJB/서비스를 정리합니다.

경우에 따라 10-20 초 밖에 소요되지 않는 비교적 짧은 작업의 경우 작업 생성 대신 비동기 EJB (@Asynchronous 검색)를 사용하여 사용자가 대기하도록하는 것이 더 적합합니다.

정보 OptimisticLockExpcetions 정보 : 데이터가 변경되는 동안 다른 사용자의 작업 스레드 또는 데이터 변경 클라이언트로 인해 데이터가 변경 될 수 있습니다. 원인을 파악하고 이것이 원인 인 경우 버그를 수정하십시오. 물론 모든 것이 어떻게 작동하는지에 대한 코드 나 설명을 제공하면 더 많은 도움을 얻을 수 있습니다.

작업 처리 중 : 다른 스레드가 동일한 작업을 처리하지 못하도록 Pessimistic Lock이있는 작업 엔터티를 가져옵니다.

귀하의 프로세스가 복잡하고보다 유연한 디자인이 필요하다고 생각합니다.

+0

이들은 이미 좋은 아이디어입니다. 나는 결코'@ 비동기'를 시도하지 않았다. – Landei