Hibernate的批量操作

2021-09-01 07:14:42 字數 2499 閱讀 5188

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

session session = sessionfactory.opensession(); transaction tx = session.begintransaction(); for ( int i=0; i<100; i++ ) tx.commit(); 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)
如果要將很多物件持久化,你必須通過經常的呼叫 flush() 以及稍後呼叫 clear() 來控制第一級快取的大小,防止記憶體溢位異常。

session session = sessionfactory.opensession();

transaction tx = session.begintransaction();

for ( int i=0; i<100000; i++ )

}

tx.commit();

session.close();

批量更新(batch update)

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

session session = sessionfactory.opensession();

transaction tx = session.begintransaction();

scrollableresults users = session.getnamedquery("getusers")

.setcachemode(cachemode.ignore)

.scroll(scrollmode.forward_only);

int count=0;

while ( users.next() )

}

tx.commit();

session.close();

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

transaction tx = session.begintransaction();

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

int updatedentities = s.createquery( hqlupdate )

.setstring( "newname", newname )

.setstring( "oldname", oldname )

.executeupdate();

tx.commit();

session.close();

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

session session = sessionfactory.opensession();

transaction tx = session.begintransaction();

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

int deletedentities = s.createquery( hqldelete )

.setstring( "oldname", oldname )

.executeupdate();

tx.commit();

session.close();

Hibernate的批量操作

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

Hibernate的批量操作

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

hibernate批量操作例項詳解

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