2012-09-20 99 views
0

我正在處理大量的實體並使用休眠將其持久化到數據庫。我發現開始事務需要很長時間,以防萬一表中的數據量很大(整個同步過程在從Web服務獲取數據需要3小時左右時花費20小時)。
有什麼辦法可以改善這種方法的持久性邏輯嗎?JPA開始交易瓶頸

final EntityManager em = emf.createEntityManager(); 
try { 
    final MfBranch branch = <get data from web service> 
    em.getTransaction().begin(); // bottleneck 
    em.merge(branch); 
    em.getTransaction().commit(); 
} finally { 
    DisposableUtils.closeQuietly(em); 
} 

我認爲合理的看到合併或事務提交操作很耗時,但爲什麼事務開始很耗時?

+0

是否有可能重用一個'EntityManager'而不是每次創建一個新的?也許用Spring注入它?每次可以避免使用新的開銷可能會有一些開銷? – millhouse

+0

你可以默認將JDBC DataSource和連接池置於autoCommit = false模式,這樣可以節省一些命令。但是,如果'從Web服務獲取數據'的時間不是瓶頸,數據庫就是瓶頸,那麼也許你應該考慮一次性在100'分支'上合併。你可能還會觀察到的是你係統中的一些其他問題,這些問題涉及到由於某些其他工作與交易中的大量數據一起工作而導致的SQL事務停滯。 –

回答

3

ObjectDB中,對於大數據持久存在於JPA中的性能問題,會有參考。