2016-08-26 2 views
0

최대 절전 모드를 처음 사용합니다. 아래 사항 중 하나라도 틀린 경우 나에게 수정하십시오.최대 절전 모드 삽입시 성능 문제

ID 생성을 위해 시퀀스 생성기를 사용하는 엔티티가 있습니다. 이 때문에 모든 삽입 한 순서를 얻기 위해 두 통화를 가지고 있으며 allocationsize에 대한 내 연구 중에 삽입을

@Id 
@SequenceGenerator(name="i_gen", sequenceName="b_seq", allocationSize=6) 
@GeneratedValue(generator="i_gen") 
private Long id; 

을 할 다른 내가 할당 크기 지정에 대한 것을 이해, 우리는 다음 몇 allocatedsize에 대한 DB를 호출하지 않지만 단순히 1 씩 증가합니다. 그러나 나는이 행동을 보지 못합니다. 내가 틀렸다면 나를 바로 잡아주세요.

다음

내가 6 객체의 경우

[INFO ] [26082016.002159] sqltiming:357 - select b_seq.nextval from dual {executed in 69 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 174 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 74 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 77 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 78 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 161 msec} 

단일 트랜잭션에 삽입 볼 수있는 SQL 로그를하다, 나는 NEXTVAL 6 삽입을 얻을 수 dB로 6 호출을 참조하십시오. 배치 삽입물을 사용하여 삽입물을 최적화했습니다. 그러나 난 seq 발전기 문제를 해결할 수 없습니다. 이 때문에 엄청난 성과를 보았습니다.

이렇게 많은 데이터베이스가 seqnumber를 가져 오기 위해 호출하지 않는 다른 방법이 있습니까?

+0

구문을 기억할 수는 없지만 JVM에 기본 키 블록을 사전 할당 한 다음 사용하십시오. – farrellmr

+0

예상 한 내용이 정확합니다. 다른 JPA는 내가 각 삽입에 대해 시퀀스를 호출하지 않고 할당 및 캐싱을 사용했다는 것을 암시합니다. 필자는 보통 '@ SequenceGenerator'가 CLASS 레벨 (필수는 아님)에서 지정되고'@ GeneratedValue' (전략적으로 더 중요 함)에서 strategy = GenerationType.SEQUENCE를 볼 것으로 기대합니다. –

답변

1

DB 시퀀스를 INCREMENT BY 6으로 설정해야합니다. 설명한대로 here allocationSize = n의 의미는 다음과 같습니다. "n 개의 지속 호출마다 한 번씩 데이터베이스의 다음 값을 가져 와서 로컬에서 값을 1 씩 증가시킵니다." 또한 this answer을 확인하십시오.