2013-05-29 3 views
0

우리는 2 개의로드 밸런싱 서버에 Spring 3 + Hibernate 애플리케이션을 배치했다.Spring 3 애플리케이션에서 Hibernate @ SequenceGenerator와 관련된 문제

데이터베이스에 50 개의 삽입 후, 최대 절전 모드는 계속해서 카운트를 증가시키는 DB 시퀀스 nextval을 호출하지 않습니다. 그리고 이것으로 인해 두 서버의 시퀀스 값이 겹쳐서 "Unique Constraint Violation"예외가 발생합니다.

예. 첫째, 두 서버의 시퀀스 값이 각각 100과 150이라고 가정 해보십시오. 첫 번째 인스턴스의 시퀀스가 ​​149에 도달하면 seq.nextVal을 호출해야합니다. 하지만 그렇게하지 않고 연속적으로 seq 값을 150으로 증가시키지 않고 다른 인스턴스에 의해 사용되어 실패하고 있기 때문에. 기본 할당 크기 : 50

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_ID_SEQ") 
@SequenceGenerator(name = "CUSTOMER_ID_SEQ", sequenceName = "CUSTOMER_SEQ") 
@Column(name = "CUST_ID", unique = true, nullable = false) 
public long getCustId() { 
return custId; 
} 

미리 감사드립니다.

답변

1

로드 균형 조정기를 사용하고 있지만 인스턴스간에 DB를 공유하는 경우 시퀀스의 값을 캐시 할 수 없습니다.

DB에 삽입 할 때마다 다음 순서 값을 요청해야합니다. 그리고 각 삽입은 트랜잭션 내부에 있어야합니다. Hibernate는 (기본적으로) allocationSize = 50이므로 문제를 해결하려면 명시 적으로 1로 설정해야합니다.

@SequenceGenerator(allocationSize=1 ...)