簡體   English   中英

Spring hibernate jdbc批量大小

[英]Spring hibernate jdbc batch size

我有幾個場景,我認為從hibernate文檔中有點不清楚。

數據類:

class HibernateDao {
      // ...

      @Transactional
      public void store(List<Object> batch) {
          for(Object o : batch) {
             hibernate.store(o);
          }
      }
}

場景1

hibernate.jdbc.batch_size = 1

Q1 :使用10項目的集合調用store(..)會發生什么? 會有10 1個交易還是只有一個?


情景2

hibernate.jdbc.batch_size = 10

Q2 :使用1項目的集合調用store(..)會發生什么? 無論batch_size屬性如何,它是否會立即寫入后備存儲?


從hibernate文檔:

如果您使用身份標識符生成器,​​Hibernate會透明地禁用JDBC級別的插入批處理

問題3 :什么被歸類為identify identifier generator ,使用注釋@Id@GeneratedValue(strategy = GenerationType.AUTO)

Q1:使用10個項目的集合調用store(..)會發生什么? 會有10個1個交易還是只有一個?

這是特定於Spring事務的,但就Hibernate而言,如果您使用一個會話和一個“事務”,它將等到“flush”或“commit”實際執行操作。 所以,一個交易。

Q2:使用1個項目的集合調用store(..)會發生什么? 無論batch_size屬性如何,它是否會立即寫入后備存儲?

不是馬上。 前面的響應中的相同內容適用於此:除非您明確要求“刷新”,否則Hibernate將在提交階段執行操作。

問題3:什么被歸類為識別標識符生成器,​​使用注釋@Id和@GeneratedValue(strategy = GenerationType.AUTO)?

Hibernate無法預測任何ID作為ID。 例如,身份(如序列,但對於T-SQL數據庫),自動增量,序列......原因很簡單:Hibernate不知道每個批處理實體的生成ID是什么,因此,插入的實體狀態與之前的狀態不同。 Hibernate通過調用“getGeneratedKeys”的JDBC方法來處理常規方案,這允許它將數據庫中的數據與其會話中的數據同步,但是不可能對批處理進行同步。

如果Hibernate確實知道實體的ID(即:assigned,hilo,uuid,......),它可以安全地執行批處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM