Hibernate的批量操作

2021-09-08 18:31:25 字數 2595 閱讀 7036

在實際的操作中,會經常的遇到批量的操作,使用hibernate將 100條記錄插入到資料庫的乙個很自然的做法可能是這樣的

1 session session =sessionfactory.opensession();

2 transaction tx =session.begintransaction();

3for ( int i=0; i<100; i++)

7tx.commit();

8 session.close();

這樣看起來似乎也沒有太大的問題,但是我們設想一下,如果現在批量的操作是100000,或者更多,問題就出現了,這段程式大概執行到 50 000 條記錄左右會失敗並丟擲 記憶體溢位異常(outofmemoryexception) 。 這是因為 hibernate 把所有新插入的 使用者(user)例項在 session級別的快取區進行了快取的緣故。

實際操作中避免這樣的情況很有必要, 那麼使用jdbc的批量(batching)功能是至關重要,將jdbc的批量抓取數量(batch size)引數設定到乙個合適值 (比如,10-50之間):

hibernate.jdbc.batch_size 20

你也可能想在執行批量處理時關閉二級快取:

hibernate.cache.use_second_level_cache false

批量插入(batch inserts)
1 session session =sessionfactory.opensession();

2 transaction tx =session.begintransaction();

3for ( int i=0; i<100000; i++) 12}

1314

tx.commit();

15 session.close();

批量更新(batch update)

此方法同樣適用於檢索和更新資料。此外,在進行會返回很多行資料的查詢時, 你需要使用 scroll() 方法以便充分利用伺服器端游標所帶來的好處。

1 session session =sessionfactory.opensession();

2 transaction tx =session.begintransaction();

34 scrollableresults users = session.getnamedquery("getusers")

5.setcachemode(cachemode.ignore)

6.scroll(scrollmode.forward_only);

7int count=0;

8while

( users.next() ) 16}

1718

19tx.commit();

20 session.close();

大批量更新/刪除(bulk update/delete)
使用query.executeupdate()方法執行乙個hql update語句:
1 session session =sessionfactory.opensession();

2 transaction tx =session.begintransaction();

34 string hqlupdate = "update user set name = :newname where name = :oldname";

5int updatedentities =s.createquery( hqlupdate )

6 .setstring( "newname", newname )

7 .setstring( "oldname", oldname )

8.executeupdate();

9tx.commit();

10 session.close();

執行乙個hql delete,同樣使用 query.executeupdate() 方法 (此方法是為 那些熟悉jdbc preparedstatement.executeupdate() 的人們而設定的)

1 session session =sessionfactory.opensession();

2 transaction tx =session.begintransaction();

34 string hqldelete = "delete user where name = :oldname";

5int deletedentities =s.createquery( hqldelete )

6 .setstring( "oldname", oldname )

7.executeupdate();

8tx.commit();

9 session.close();

Hibernate的批量操作

在實際的操作中,會經常的遇到批量的操作,使用hibernate將 100條記錄插入到資料庫的乙個很自然的做法可能是這樣的 session session sessionfactory.opensession transaction tx session.begintransaction for in...

Hibernate的批量操作

在實際的操作中,會經常的遇到批量的操作,使用hibernate將 100條記錄插入到資料庫的乙個很自然的做法可能是這樣的 session session sessionfactory.opensession transaction tx session.begintransaction for in...

hibernate批量操作例項詳解

hibernate的批量處理 hibernate完全以物件導向的方式來運算元據庫,當程式裡以物件導向的方式操作持久化物件時,將被自動轉換為對資料庫的操作。例如呼叫session的delete 方法來刪除持久化物件,hibernate將負責刪除對應的資料記錄 當執行持久化物件的set方法時,hiber...