2015-10-05 196 views
2

我有大約5000條記錄要更新。我正在嘗試測量操作的性能。它從大約100毫秒開始,但是在每千次更新之後,操作時間大約會增加80毫秒。爲什麼它放緩? JVM?休眠批處理操作性能

StatelessSession session = dao.getStatelessSession(); 
Transaction transaction = session.beginTransaction(); 
try { 
    List<Entity> list = dao.findAll(); 
    int counter = 0; 
    for (Entity each : list) { 
     final Date startTime = Clock.getTime(); 
     webService.execute(each); 
     session.update(each); 
     counter += 1; 
     final Date endTime = Clock.getTime(); 
     LOGGER.info("***** " + getMilliSecondsDifference(startTime, endTime) + " for count: " + counter + "*****"); 
    } 
} catch (Exception e) { 
    LOGGER.info("***** Exception occured : ", e); 
} finally { 
    transaction.commit(); 
    session.close(); 
} 
+3

也是一個webService調用。是什麼讓你想到hibernate越來越慢?我建議你關閉werbservice執行部分並再次測量。 –

+0

關閉web服務調用後,我嘗試了15000個實體,他們都是4毫秒左右。這似乎是答案,但我不能接受評論作爲答案。你能發表這個答案嗎? –

回答

1

Hüseyin,

如果我們看看你的代碼,它並不一定是休眠問題。 我建議你註釋掉與webservice調用相關的行。

然後請再次嘗試批處理hql運行。

也許網絡可能會變慢。

0

您有一個事務並處理大量對象。在這裏你可能會有內存泄漏和性能問題。 對象引用將保留在內存中,直到執行會話刷新(提交)。所以你將在內存中擁有大量的對象,此外還有大量關於對象變化的信息,這些信息也將保存在休眠會話中,並且可能會改變性能(我不是休眠專家,但你應該考慮到這一點) 我認爲,你可以考慮使用大量的交易

見論文相關鏈接:

Transaction Management for bulk operations

Hibernate session and Transaction Management Guidelines

好運

+0

我正在使用StatelessSession,它不保留每個髒對象。即使對於正常的會話,多次交易也是不必要的你只需要沖洗和清除。如你所說,我用多次交易來衡量,這是一樣的。 –

+0

我看,這使得它更加複雜,你可以嘗試看看它是由web服務調用還是數據庫引起的。嘗試忽略其中的一個並查看結果(例如忽略更新並保持web服務調用) – jMounir