2012-04-23 13 views
6

Ho un file di testo ~ 6 GB che ho bisogno di analizzare e poi persiste. "Analizzando" sto leggendo una riga dal file (di solito 2000 caratteri), creo un oggetto Car dalla linea e successivamente lo mantengo.problema di prestazioni di ibernazione, persistono uno per uno o di massa?

Sto utilizzando un pattern consumer consumer per analizzare e persistere e mi chiedo se fa alcuna differenza (per motivi di prestazioni) per mantenere un oggetto alla volta o 1000 (o qualsiasi altra quantità) in un commit?

Al momento, mi ci vuole> 2hr per mantenere tutto (3 milioni di righe) e sembra troppo tempo per me (o potrei sbagliarmi).

Attualmente sto facendo questo:

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(); 
    } 
} 

Prima di fare tutte le modifiche progettuali Mi chiedevo se c'è un motivo per cui questo progetto è meglio (o meno) e se sì, quali dovrebbero essere le vetture. dimensione()? Inoltre, l'apertura/chiusura della sessione è considerata costosa?

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(); 
    } 
} 

risposta

5

Tradizionalmente lo stato di ibernazione non va bene con gli inserti di grandi dimensioni. Ci sono alcuni modi per ottimizzarlo a un certo livello.

Prendete questo esempio dal 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(); 

Nell'esempio precedente la sessione se arrossata dopo l'inserimento di 20 voci che renderanno po 'più veloce l'operazione.

Qui uno interesting article discutendo la stessa roba.

Abbiamo implementato con successo un modo alternativo di inserimento di massa utilizzando procedure memorizzate. In questo caso passerai i parametri all'SP come "|" elenco separato e scriverà gli script di inserimento all'interno dell'SP. Qui il codice potrebbe sembrare un po 'complesso ma è molto efficace.

+0

Proverò questo codice per le prestazioni e tornare a questa risposta. Grazie! Il dosaggio – adhg

+0

è migliore! – adhg

Problemi correlati