2012-01-20 60 views
14

這個Hibernate配置表面上應該控制在第一級緩存中有多少對象被緩存。原因很容易理解,我們不想耗盡內存。指定hibernate.jdbc.batch_size有什麼意義?

但有些事情讓我感到困惑。我看到的每個實現包括this website 都有明確的清晰和清晰。沒問題,但那配置屬性有什麼意義?

注意:我假設Hibernate監視緩存的大小,並且如果某個類型的對象的數量增長到大於緩存大小,那麼將緩存與數據庫同步。不知道這個假設是錯誤的嗎?

回答

21

此配置選項與第一級緩存的大小無關。刷新會話不會從緩存中刪除任何內容。它將掛起的更改(插入,刪除,更新)寫入數據庫。只有在明確調用clear()或關閉會話時纔會清除緩存。如果您沒有清除或者分段會話(或者檢測特定實體),緩存將繼續增長並且不斷增長。這不是問題,因爲它通常非常短暫(交易的持續時間)。

JDBC批處理更新允許將單個批處理中的多個更新查詢發送到數據庫。它減少了網絡呼叫的數量。您可以將其視爲上傳包含20個文件的未壓縮zip文件,而不是單獨發送20個文件。

這個混淆來自於這樣一個事實,即在您的問題中鏈接的頁面中提到的批更新與JDBC批更新無關。 Hibernate對批量更新的含義是「通過批量作業完成更新」。批處理作業通常具有比典型業務用例更長的事務,並且在單個事務中更新數百,數千或甚至更多的實體。這就是爲什麼Hibernate建議在這種情況下定期清理和清除會話,以避免內存不足。

+0

謝謝,澄清它。不知何故,我認爲他們是相關的,但這些都是單獨的優化。 –