在本文中,我們將看到如何在Hibernate中執行批次插入/更新。
每當我們執行一條sql語句時,我們都是透過對資料庫進行網路呼叫來完成的。現在,如果我們必須向資料庫表中插入 10 個條目,那麼我們必須進行 10 次網路呼叫。相反,我們可以透過使用批次來優化網路呼叫。批次允許我們在單一網路呼叫中執行一組 SQL 語句。
為了理解並實作這一點,讓我們定義我們的實體−
@Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; // Getters //Setters }
為了在Hibernate中啟用批次處理,我們需要在我們的應用程式中新增一個屬性
properties檔案: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的情況下進行的。
以上是如何在Hibernate中執行批次插入更新操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!