필자는 MDB, 스프링 통합 및 지속성을위한 JPA를 기반으로하는 이벤트 기반 응용 프로그램을 보유하고 있습니다. 응용 프로그램은 max-pool-size 기본값 (16)을 사용하여 weblogic 10.3에 배포됩니다.MDB의 레이스 조건 : 가장 좋은 방법은 무엇입니까?
내 응용 프로그램은 DB를 수정하는 일부 메시지를 처리해야합니다. 도메인 객체가 존재하지 않거나 존재하는 경우 업데이트 할 필요가있는 로직에 대해 도메인 객체를 삽입해야한다는 일부 메시지를 처리해야하는 경우를 상상해보십시오.
개체가 존재하는지 여부를 DB 확인을 수정하고 JPA에서 병합을 호출하는 구성 요소. DAO에서 병합을 호출 할 때 두 개의 동시 메시지가 병렬로 실행되기 때문에 JPA는 개체가 아직 보존되지 않았기 때문에 JPA에서 두 개의 INSERT 문을 트리거하므로 그 중 하나만 올바르게 실행됩니다.
이벤트 구동 응용 프로그램에서 이러한 종류의 "경쟁 조건"을 처리 할 패턴이 있습니까?
종류 마시모 가장 간단한 해결책은 업데이트를 수행해야하는 다시 merge
전화, 제 삽입에 의해 발생 된 예외를 캐치하는
좋습니다. 직렬화 가능 레벨이 직렬화 가능한 노드인지 또는 클러스터인지 여부를 알고 있습니까? 두 노드가있는 클러스터에 응용 프로그램을 배포해야합니다. 친절합니다. Massimo –
@MassimoUgues : 트랜잭션 관리자에 따라 다르지만 일반적으로 데이터베이스 수준의 격리이므로 클러스터에 안전해야합니다. – skaffman
JTA 스프링을 사용하기 때문에 클러스터에 안전해야합니다. 나는 격리 = SERIALIZABLE에 대해 큰 병목이 될 것이라고 생각하고있었습니다. 동일한 ID로 식별되는 일부 도메인 객체에 영향을 미치는 메시지에 대해서만 이러한 종류의 동시성을 처리해야하므로 일종의 db 기반 모니터 (예 : 해당 ID의 업데이트를 위해 일종의 선택)를 생각하고있었습니다. 당신이 그것에 대해 어떻게 생각하십니까? –