Hibernate的批量操作
生活随笔
收集整理的這篇文章主要介紹了
Hibernate的批量操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
批量插入
Hibernate強制開啟了一級緩存,緩存空間是有限的,如果批量操作的SQL語句太多,就會運行失敗(內存溢出),
因此在批量操作的時候,每執行一批SQL語句,都需要刷新緩存,例如下面這樣,每執行20條SQL,刷新一次緩存。
1 for (int i = 0; i < 10000; i++) { 2 User u = new User("張三", 20, "中國廣州"); 3 sess.save(u); 4 if (i % 20 == 0) { 5 sess.flush(); 6 sess.clear(); 7 } 8 }除了對session級別的緩存進行清理,hibernate還建議如下配置來關閉SessionFactory的二級緩存
hibernate.cache.use_second_level_cache false
批量更新
與批量插入一樣,都需要清空一級緩存。
在更新數據前,需要先查出數據,用scroll()方法查出數據,可以使用游標帶來的性能優勢(next()方法).
例如下面這樣,
1 ScrollableResults users = sess.createQuery("from User") 2 .setCacheMode(CacheMode.IGNORE) 3 .scroll(ScrollMode.FORWARD_ONLY); 4 int count = 0; 5 while (users.next()) { 6 User u = (User) users.get(0); 7 u.setName("新用戶名"+count); 8 if (++count % 20 == 0) { 9 sess.flush(); 10 sess.clear(); 11 } 12 }上面是逐行更新,適合每行要更新成不同值的情況。這種更新速度會很慢,下面這種更新則是真正的批量更新,查詢和更新都使用同一條語句,適用于所有行都更新成相同值。
DML風格的批量更新
1 String hqlUpdate = "Update User u set name = :newName"; 2 int updateEntities = sess.createQuery(hqlUpdate) 3 .setString("newName", "新名字") 4 .executeUpdate();DML風格的批量刪除
1 String hqlUpdate = "delete User"; 2 //返回最后一條SQL語句影響的行數 3 int updateEntities = sess.createQuery(hqlUpdate) 4 .executeUpdate();DML風格的操作性能明顯比前面的好,但是在更新的時候貌似只能把所有行更新成相同值,在刪除的時候只能返回最后一個SQL所影響的行數。
?
轉載于:https://www.cnblogs.com/fysola/p/6279215.html
總結
以上是生活随笔為你收集整理的Hibernate的批量操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 文件服务----------
- 下一篇: 使用maven导入任意jar包