2017-04-13 29 views
0

我從身份生成器移動到序列希望它可以提高我的批量插入的性能。我正在使用批量大小爲50的JPA EntityManager的持久化方法進行批量插入。插入多達300K條記錄。在Sequence generator中將allocateSize設置爲1與使用Identity Generator相同?

實體表具有主鍵列如下設置 - ID:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myseq") 
@SequenceGenerator(name="myseq", sequenceName="my_table_id_seq", allocationSize = 1) 
private Long id; 

早些時候,我只是用allocationSize爲50默認,並用此屬性 - 「hibernate.id.new_generator_mappings」 - (設置爲true),我遇到了問題 - 批處理條目0插入到休眠狀態,使用getNextException()

因此,我改變了allocationSize爲1.從那時起,我沒有看到上述問題。然而,這並沒有像分配大小50那樣提高性能。但是這也導致由於分配大小50而已經存在的新ID和ID之間的瘋狂差距。

+0

使用Hi-Lo發生器,當您定義並獲取100或50並將其保存在緩存中時..所以性能將得到提高 – rajadilipkolli

回答

0

我意識到休眠增加太多開銷。剛剛使用JdbcTemplate插入超過100萬,它的作品就像一個魅力:)

我會使用休眠只有當數據加載不是那麼巨大!

1

如果您在那裏使用allocationSize,則每個實體需要執行「從DUAL中選擇SEQ.nextval」以從指定的序列中獲取ID。這對你的大記錄來說是個問題。

你需要設置一個屬性在Hibernate這樣的:

properties.setProperty("hibernate.id.new_generator_mappings", Boolean.toString(true));