天天看點

Hibernate 5.3 (六)

文章目錄

      • Hibernate 批量處理
        • Hibernate 批量插入
        • Hibernate 批量更新
        • DML 風格 批量更新、删除

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 請到下一節檢視相關知識點。

繼續閱讀