2014-03-04 69 views
0

我遇到了一些與Hibernate有關的性能問題,而且我卡住了。在循環中創建對象

我有一個嵌套的foreach,首先遍歷一張地圖,然後通過地圖中的每個鍵來創建一個對象。

for(Map<String, Object> csvRow : csvRows){ 
    Contact contact = new Contact(); 
    contact.setContactId(nextContactId); 
    for(String key : csvRow.keySet()) 
    { 
     contact.setDetails(key, csvRow.get(key)); 
     contactList.addContact(contact); 
    } 
    nextContactId++; 
} 

我的問題出現在上面的代碼大概需要10秒鐘才能運行。這是一個大約2MB的CSV輸入,但該服務必須有效地處理200MB(至少)的文件。 我被卡住的原因是下面的代碼在大約1.6秒內運行,但只創建一個Contact對象的單個實例(這是公平的),我明白爲什麼會發生這種情況。

Contact contact = new Contact(); 
for(Map<String, Object> csvRow : csvRows){ 

    contact.setContactId(nextContactId); 

    for(String key : csvRow.keySet()) 
    { 
     contact.setDetails(key, csvRow.get(key)); 
     contactList.addContact(contact); 
    } 
    nextContactId++; 
} 

我已經試過了平常的事情像處理一個關鍵的每次迭代中對象的ID手動設置爲null。爲了使事情更清楚,聯繫對象不應該代表一個完整的人,而是代表聯繫人的一條信息。每個聯繫人將具有相同的contactId,並且我有一個包裝器對象將它們聯繫在一起,但這與我的問題無關。

我的問題是這樣的:我如何保持後者的性能,同時仍然創建我需要的所有對象。此外,我需要保留我所擁有的對象結構,因爲我無法控制可能缺失數據左右中心的源CSV,因此我使用的對象結構。如果您需要更多信息,我非常期待您的回覆。

編輯#1:使用休眠4.2.8,彈簧3.2.6

回答

0

修復了這個問題。它實際上不是一個Hibernate問題,而是一個內存管理問題。查看解決方案here