如何在Hibernate中執行批次插入更新?


在這篇文章中,我們將瞭解如何在Hibernate中執行批次插入/更新。

每當我們執行SQL語句時,我們都是透過向資料庫發出網路請求來完成的。現在,如果我們要向資料庫表中插入10個條目,則需要發出10次網路請求。相反,我們可以透過使用批處理來最佳化我們的網路請求。批處理允許我們透過單個網路請求執行一組SQL語句。

為了理解和實現這一點,讓我們定義我們的實體 -

@Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; // Getters //Setters }

要在Hibernate中啟用批處理,我們需要在應用程式屬性檔案中新增一個屬性

spring.jpa.properties.hibernate.jdbc.batch_size=3

現在,我們需要執行EntityManager的persist函式以將資料插入資料庫

示例

@Autowired private EntityManager entityManager; @Test Public void InsertInBatch(){ for (int i = 0; i < 6; i++) { Parent parent = Parent[i]; entityManager.persist(parent); } }

輸出

"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P1","1"],["P2","2"],["P3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["insert into parent (name, id) values (?, ?)"], "params":[["P4","4"],["P5","5"],["P6","6"]]

我們可以從控制檯看到,向父表插入資料是批次進行的,每次批次大小為3。

在持久化實體時,可能會發生OutOfMemoryException,因為Hibernate將實體儲存在持久化上下文中。因此,為了最佳化,我們可以在每個批處理後使用實體管理器的flush()和clear()。

批次更新意味著透過單個網路請求更新大量資料。

對於批次更新,流程相同。我們需要在應用程式屬性檔案中新增以下兩個語句,然後執行更新過程。

spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true

示例

更新資料的程式碼 -

@Autowired private EntityManager entityManager; @Test public void UpdateInBatch() { TypedQuery<Parent> query = entityManager.createQuery("SELECT p from Parent p", Parent.class); List<Parent> Parents = query.getResultList(); int i=1; for (Parent parent : Parents) { String s="Parent"+Integer.toString(i); i++; parent.setName(s); } }

Hibernate現在將這些語句繫結到單個批處理中並執行它們。

輸出

"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent1","1"],[" Parent2","2"],[" Parent3","3"]]
"batch":true, "querySize":1, "batchSize":3, "query":["update parent set name=? where id=?"], "params":[["Parent4","4"],["Parent5","5"],["Parent6","6"]]

我們可以從控制檯看到,更新父表中的資料是批次進行的,每次批次大小為3。

更新於: 2022年8月26日

3K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告