Hibernate 5.3 (六)
阿新 • • 發佈:2018-12-11
Hibernate 批量處理
如果我們需要通過Hihernate 去處理大量的資料,就需要使用Hibernate 批量處理,提高效能。
Hibernate 批量插入
String[] names = new String[1000]; String[] genders = new String[1000]; for(int i = 0;i<1000;i++){ Person p = new Person(); p.setName(names[i]); p.setGender(genders[i]); if(i%20==0){ ss.flush();//將session 的資料儲存到資料庫中 ss.clear();//清空session } }
上述例子,比較簡單,對映檔案就不給出了。這裡我無法找1000個數據,一般把大量的資料放到陣列中迴圈操作。同時在一定時候,將session中的資料儲存的資料庫中,而不是等1000個數據,一下子全部存到資料庫中。
<property name="hibernate.cache.use_second_level_cache">false</property>
使用手動清除session 快取,還應該配置上面的,關閉二級快取。
Hibernate 批量更新
在批量更新的時候,面臨的問題就是如何先批量查詢出來,然後在查詢出來的結果上,進行批量的更新。
String[] names = new String[1000]; org.hibernate.ScrollableResults persons = ss.createQuery("select person_name from person") .setCacheMode(org.hibernate.CacheMode.IGNORE).scroll(org.hibernate.ScrollMode.FORWARD_ONLY); //ScrollableResults 這個物件,查詢出來的資料,它有點滾動的效果,next一次之後,它就會指向接下來的一條資料 //所以每次get(0),就可以獲取新的物件 int count = 0; while(persons.next()){ Person p = (Person) persons.get(0); p.setName(names[count++]); if(count%20==0){ ss.flush(); ss.clear(); } }
開啟手動清理session 快取,同樣要配置上述例子的關閉二級快取。
通過這種方式,雖然可以執行批量更新,但效果非常不好。執行效率不高,需要先執行資料查詢,然後再執行資料更新,而且這種更新將是逐行更新,即每更新一行記錄,都需要執行一條update語句,效能也非常低下。為了避免這種情況,Hibernate 提供了一種類似於DML語句的批量更新、批量刪除的HQL語法。
DML 風格 批量更新、刪除
String hqlsql = "update Person set name = : newName"; int updaterow = ss.createQuery(hqlsql).setString("newName", "laohe").executeUpdate();//這裡將滿足條件的Person 例項,都會修改名字
這個後臺列印的sql ,只有一條update 語句,所以效能是nice的。
從上面的程式碼中可以看出, 這種語法非常類似於PreparedStatement的executeUpdate語法(就是那個佔位符),實際HQL的這種批量更新就是直接借鑑了SQL語法的UPDATE語句。
批量刪除:
String hqlsql = "delete Person";
int deleterow = ss.createQuery(hqlsql).executeUpdate();
這裡因為涉及hql ,在這不多說,瞭解hql 請到下一節檢視相關知識點。