2012-04-23 90 views
6

我有一個文本文件~6GB,我需要解析並稍後保存。通過'解析'我正在從文件中讀取一行(通常爲2000個字符),從行中創建一個Car對象,之後我堅持它。我正在使用生產者消費者模式來解析和持久化,並懷疑它是否有任何區別(出於性能原因)在一次提交中一次持續一個對象或1000(或任何其他數量)?現在,我需要花費2個多小時來堅持一切(300萬行),而且對我來說看起來太多時間了(或者我可能是錯的)。之前,我做任何設計變更我想知道是否有一個原因,這樣的設計是更好的(或不),如果是,應該是什麼車休眠性能問題,堅持一個一個還是大衆?

public void persistCar(Car car) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 

     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

目前我在做這個。尺寸()?另外,會議的開/閉會被認爲是昂貴的嗎?

public void persistCars(List<Car> cars) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 
     for (Car car : cars)  
     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

回答

5

傳統上,hibernate對於批量插入不能很好地執行。有一些方法可以將其優化到某個級別。

如果插入20個條目,這將使操作快一點後沖洗以本實施例中從API Docs

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

在上述例子中的會話。這個interesting article討論相同的東西。

我們已經成功實現了使用存儲過程的替代方式的批量插入。在這種情況下,您將參數傳遞給SP作爲「|」分隔列表,並將寫入SP內的插入腳本。這裏的代碼可能看起來有點複雜,但是非常有效。

+0

我會嘗試此代碼的性能,並回到這個答案。謝謝! – adhg 2012-04-23 23:40:53

+0

配料比較好! – adhg 2012-05-05 20:48:45