2014-02-19 2 views
0

사용자가 JSON을 내 API에 게시 한 다음 엔터티로 deserialize되고 데이터베이스에 유지되는 프로젝트가 있습니다. 동일한 API 키를 사용하지만 다른 '사용자'로 많은 요청을 게시하는 부하 테스트 도구를 빠르게 연속적으로 실행했기 때문에 일부 엔티티가 데이터베이스에서 복제 중임을 발견했습니다.데이터베이스에 중복 항목이 빠르게 생성되는 것을 방지하려면 어떻게해야합니까? (JPA)

내 코드는 개체가 데이터베이스에 이미 있는지 확인하지만 일부 요청은 동시에 너무 빠르게 실행되며 검사를 건너 뜁니다.

엔티티 관리자를 사용하면 각 요청이 고유 한 트랜잭션으로 생각되지만이 트랜잭션을 '잠금'하는 방법을 모르겠습니다. 일반적인 자바 동기화 블록 안에 생성 코드를 넣지 않고이 복제를 방지 할 수있는 방법이 있습니까?

감사합니다.

+0

데이터베이스에 레코드를 삽입이 em.persist?의 @Id가 설정? 어떻게?, 데이터베이스가있는 것입니다

희망? – Koitoer

답변

0

먼저 테이블에 고유 한 제약 조건을 만들 수 있으며 복제를 삽입하려고하면 예외가 발생합니다.

다른 것은 transaction isolation level을 더 엄격한 (serializable?)으로 변경하는 것입니다. 그러나 DB에 대한 액세스 속도가 느려질 것이므로 절충안이 있습니다.

로드 테스트를 제외하고 이러한 충돌이 자주 발생하지 않기 때문에 첫 번째 방법을 사용하는 것이 좋습니다.

+0

Glassfish 서버의 트랜잭션 격리 수준은 이미 직렬화 가능하지만 데이터베이스는 변경할 수 없습니다. 위의 대답에 대한 의견보기 :) – Da49

+0

당신은 당신의 check 메소드를 동기화 할 수 있습니다. 당신은 당신 자신의 insert native SQL을 작성할 수 있습니다. 중복 된 레코드를 허용하고 나중에 청소할 수 있지만, 이것들은 모두 일시적인 해결책입니다. 그리고 다시 트레이드 오프 : 중복을 방지하거나 성능을 유지하는 것이 더 중요합니까? 하지만 지금은 JPA의 특정 솔루션을 생각할 수 없습니다. –

0

관계형 데이터베이스 (I.E. SQL)를 사용하는 경우 가장 쉬운 방법은 데이터베이스에서 수행하는 것입니다. 데이터베이스 테이블에 대한 고유 한 제한 조건 :

CREATE UNIQUE INDEX unique_author_name ON authors (first_name, last_name); 

위의 예에는 "authors"라는 데이터베이스 테이블이 있습니다. 각 저자는 성과 이름이 있습니다. 이 제약 조건으로 인해 데이터베이스에 2 개의 "Mark Twain"이 저장되지 않습니다.

JPA는 복제 추가 시도가 발생하면 PersistenceException 및 ConstraintViolationException을 발생시킵니다. 도움이 :)

+0

테이블에 고유 한 키를 만들 수 없습니다 (다른 경우로 인해 멀티 테넌시 데이터베이스에서 문제 발생). 그래서 나는 창조가 끝날 때까지 다른 사람들을 잠 그려면 데이터베이스 레벨 이상의 방법이 필요합니다. – Da49

+0

임시 테이블이 마음에 듭니다 ... '실제'테이블에 삽입하지 않고 스크래치 테이블에 삽입하고 중복되지 않은 행에 프로세스를 복사하도록합니다. 이런 세상을 유지하고 싶지는 않군요. – Gimby

관련 문제