Spring Hibernate處理大批量資料

2021-07-29 05:13:01 字數 1562 閱讀 6206

原文:

關於使用spring+hibernate進行大批量資料的插入和更新,它的效能和使用jdbc 

preparedstatement的batch批量操作以及資料庫的儲存過程操作幾乎可以一樣高。在hibernate的官方文件裡說到了batchprocessing。spring+hibernate大批量處理資料想要說明如何使用hibernate大批量處理資料獲得高效能。

使用hibernate將 100 000 條記錄插入到資料庫的乙個很自然的做法可能是這樣的

session session = sessionfactory.opensession();  transaction tx = session.begintransaction();  for ( int i=0; i<100000; i++ )   tx.commit();  session.close();
這段程式大概執行到 50 000條記錄左右會失敗並丟擲 

記憶體溢位異常(outofmemoryexception)

。這是因為 hibernate 把所有新插入的 

客戶(customer)例項在session級別的快取區進行了快取的緣故。

我們會在本章告訴你如何避免此類問題。首先,如果你要執行批量處理並且想要達到乙個理想的效能,那麼使用jdbc的批量(batching)功能是至關重要。將jdbc的批量抓取數量(batch size)引數設定到乙個合適值(比如,10-50之間):

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

hibernate.cache.use_second_level_cache false

如果要將很多物件持久化,你必須通過經常的呼叫 

flush()

以及稍後呼叫 

clear()

來控制第一級快取的大小。

session session = sessionfactory.opensession();  transaction tx = session.begintransaction();       for ( int i=0; i<100000; i++ )   }       tx.commit();  session.close();

此方法同樣適用於檢索和更新資料。此外,在進行會返回很多行資料的查詢時,你需要使用 

scroll()

方法以便充分利用伺服器端游標所帶來的好處。

session session = sessionfactory.opensession();  transaction tx = session.begintransaction();       scrollableresults customers = session.getnamedquery("getcustomers")      .setcachemode(cachemode.ignore)      .scroll(scrollmode.forward_only);  int count=0;  while ( customers.next() )   }       tx.commit();  session.close();

spring hibernate引起的延遲載入

在hibernate中,延遲載入是1個非常大的優點,但有時候卻給我們帶來一些小麻煩,在後台查詢結束 後,session已經關閉,但在前台顯示的時候,如果存在關聯關係就會產生延遲載入異常。解決辦法是客戶端每次請求就分配1個session,將請求結果返回給客戶端,並完成展現後關閉session 實現這個...

Spring Hibernate整合注意事項

1 spring jar包 需要額外加入 commons pool 和commons dbcp 若包含 spring 自帶的測試,還需要引入 spring test 2 spring beans.xml 如果使用了 spring annotation 則需要加入以下兩項配置 前提是已經匯入了bean...

spring hibernate事務的配置

最近要用到spring hibernate來開發。下面來說一下這兩都組合後的事務管理問題。首先我們來明白什麼是事務,簡單的說就是一次對資料庫的操作。事務它有四個特性 原子性,永續性,隔離性和一致性。原子性是指 對資料庫的一次原子操作,要麼從裡寫資料,要麼刪除資料。隔離性是指 由併發事務所作的修改必須...