2017-12-26 21 views
0

Hibernate javax.persistence.SequenceGenerator.allocationSize() 속성을 사용하는 데 문제가 있습니다. 1로 설정하면 많은 레코드를 데이터베이스에 삽입 할 때 성능 문제가 발생합니다. 그렇지 않으면 기본값 (50) 이상으로 설정하면 지정된 식별자가있는 엔티티가 alredy라는 예외가 발생합니다!javax.persistence.SequenceGenerator.allocationSize()가 INCREMENT BY와 일치해야합니까?

가장 큰 문제는 많은 개발자가 공유 데이터베이스를 사용하므로 생성 된 식별자가 동기화되지 않을 가능성이 높습니다.

반면에 나는 오라클 시퀀스가 ​​"INCREMENT BY 1"을 사용하여 생성되었음을 확인했습니다. allocSize에 맞게 설정하면 문제를 해결할 수 있습니까?

WildFly 10.1 (최대 절전 모드 버전 5.0.10)과 Oracle 12c (12.2.0.1)를 사용하고 있습니다.

미리 감사드립니다.

+0

예. 그들이 같지 않으면이 문제가 발생합니다. by Increment는 시퀀스에 대한 데이터베이스 설정이며, allocationSize 속성은 더 많은 시퀀스를 위해 시퀀스로 돌아 가기 전에 사용할 수있는 숫자의 수를 알려주는 JPA 값입니다. – Chris

답변

0

예, SequenceGeneratorallocationSize 값과 데이터베이스가 시퀀스를 증가시키는 단계는 동일해야합니다.

allocationSize 속성을 50으로 설정하면, 시퀀스가 ​​50 씩 증가하고 시퀀스에서 다음 값을 선택하기 전에 내부적으로 49 개의 값을 생성한다는 것을 Hibernate에 알린다.

allocationSize 및 시퀀스 증가분을 동기화 상태로 유지하면 중복 ID를 염려 할 필요가 없습니다.

동일한 데이터베이스에 연결하는 2 개의 서버가 있습니다. 두 서버 모두 allocationSize을 50으로 사용하고 데이터베이스 시퀀스를 50 씩 증가하도록 구성했습니다.

Server1은 시퀀스에서 새 값을 요청하고 1000을 얻습니다.이 값은 내부적으로 저장되며 1049에 도달 할 때까지 증가시킵니다. 한편

는 서버 2는 당신이 볼 수 있듯이 데이터베이스 순서에 의해 반환 된 다음 값이 1100이 될 것이다 1099

때까지가이 값을 증가합니다 순서에서 새 값을 요청하고 (1050)을 얻는다 중복 ID가 없습니다. 그러나 기본 키 값 사이에는 간격이있을 수 있으며 데이터베이스 레코드를 시간 순서대로 정렬하는 데 사용할 수 없습니다. 하지만 어쨌든 기본 키는 사용하지 말아야합니다 ...