2010-05-24 2 views
4

@TableGenerator를 사용할 때 id가 1, 2, ...에서 32, xxx, 65, xxx ...로 점프하지 않도록하려면 allocationSize = 1을 추가해야하는 이유는 무엇입니까?@TableGenerator를 지정하지 않을 때 GeneratedValue 점프 (strategy = GenerationType.TABLE)의 원인은 무엇입니까?

allocationSize를 지정해야하는 이유가 있습니까?

이 조각은 여기에 제대로 시퀀스 식별자

@Id 
@GeneratedValue(strategy = GenerationType.TABLE, generator = "account_generator") 
@TableGenerator(name = "account_generator", initialValue = 1, allocationSize = 1) 
private Long id; 

답변

2

Hibernate는 성능상의 이유로 ID의 블록을 캐시를 생산하는 수정 조각이의 점프 IDS

@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
private Long id; 

을 생산하는 것입니다. 데이터베이스에서 여러 개의 ID를 할당하고 유지하면 시퀀스에서 다른 블록을 할당하므로 시퀀스 값이 증가합니다 (따라서 시퀀스 값이 증가합니다)

+0

1의 블록 크기를 사용할 때 객체를 유지할 때 성능이 저하된다는 사실을 알고 있어야합니다. – Justin

+0

@Justin : 블록 크기를 1로 지정하면 성능이 저하되는 이유는 무엇입니까 ?? –

+0

@n_g : 새로운 객체가 모두 유지되기 위해서는 id가 필요하므로, hibernate는 id 테이블에 대한 select와 update를 수행한다. 블록 크기를 늘리면이 블록 크기만큼의 ID만큼 캐시 (즉 예약)를 최대 절전 모드로 설정하고이 캐시를 모두 사용하면 id 테이블 만 쿼리/업데이트합니다. – rudolfson

0

나는 그것이 주장하지 않고 있지만 기본 생성기의 버그 일 수 있습니다 최대 절전 모드. Hibernate의 포럼에서 이상한 동작을 설명하는 this post, New (3.2.3) Hibernate identifier generators의 코멘트 또는 Jira의 기존 문제를 언급 한 문제를 참조하십시오.

내 제안은 귀하의 경우에 사용 된 발전기를 식별하고 기존 문제를 검색하거나 새 문제를 열어 보는 것입니다.

관련 문제