日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate的批量操作

發布時間:2023/11/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的批量操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。