[英]Spring hibernate jdbc batch size
我有幾個場景,我認為從hibernate文檔中有點不清楚。
數據類:
class HibernateDao {
// ...
@Transactional
public void store(List<Object> batch) {
for(Object o : batch) {
hibernate.store(o);
}
}
}
hibernate.jdbc.batch_size = 1
Q1 :使用10
項目的集合調用store(..)
會發生什么? 會有10 個 1個交易還是只有一個?
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.