2009-08-03 10 views
8

Sto usando nella mia applicazione un mix Spring/Hibernate (niente di originale). Per una determinata funzione, devo importare il contenuto di un file CSV in una tabella del mio DB Oracle. Per ora, juste creare gli oggetti, lo faccioInserti di massa con molla/Hibernate

HibernateTemplate.saveOrUpdate 

su ognuno di essi (ho bisogno di recuperare il loro appena allocato Id)

Poi la transazione si verifica alla fine del metodo, utilizzando il API di transazione Spring.

Tutto funziona bene, tranne le prestazioni, che è corretto per gli oggetti un po 'di 5000, ma non per 100 000 ...

Così ho cercare idee per accelerare questa roba. Ho sentito di inserimenti di massa con Hibernate, ma non ho trovato alcun riferimento solido. Qualcuno può darmi qualche idea per eseguire questa importazione con prestazioni migliori?

+1

Non intendo essere uno stronzo qui, ma la documentazione su questo è piuttosto concisa e richiede solo 5 minuti per leggere: http://docs.jboss.org/hibernate/stable/core/reference/en/html /batch.html – Tim

+0

Grazie per il link, che è esattamente quello che stavo cercando. Ho fatto alcune ricerche prima e non l'ho trovato, ma sono un principiante riguardo allo scavare nella documentazione di Hibernate. Il collegamento –

risposta

7

Qualcosa di semplice si potrebbe provare è quello di svuotare e cancellare la sessione di dire ogni 100 oggetti ...

quindi eseguire

session.flush(); 
session.clear(); 

ogni 100 o 1000 inserti.

Ciò svuota e cancella la sessione di ibernazione e blocca la crescita troppo grande (probabilmente perché i 100.000 oggetti impiegano così tanto tempo).

Inoltre, se si utilizza il generatore di identificatore di identità, la funzione di ibernazione disattiverà automaticamente gli inserimenti batch. Gli inserti batch miglioreranno le prestazioni. Dovresti anche specificare la proprietà di configurazione hibernate.jdbc.batch_size equivalente al tuo 100 alla volta.

Manning's Java Persistenza con Hibernate è stata la fonte di questo (ottimo libro - mi ha salvato molte volte la pelle).

6

Si potrebbe anche considerare l'utilizzo di StatelessSession poiché è progettato per operazioni di massa.

StatelessSession ss=sessionFactory().openStatelessSession(); 
Transaction tx=ss.beginTransaction(); 
+1

è errato: https://www.hibernate.org/hib%5Fdocs/v3/api/org/hibernate/StatelessSession.html –

+0

a questo punto, entrambi i collegamenti sono errati. ecco il nuovo link: http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/StatelessSession.html – Isaac

3

A volte un ORMapper non è il martello giusto per l'unghia. Soprattutto le operazioni in batch sono spesso eseguite in modo più efficiente con il semplice vecchio JDBC. Questo ovviamente dipende da una varietà di condizioni ma dovresti almeno vederlo come un'opzione e confrontare le prestazioni di entrambi gli approcci.

0

Non si tratta semplicemente di un problema di prestazioni dell'inserto di database; se stai creando decine di migliaia di oggetti e non esegui un flush, la sessione di Hibernate crescerà fino a esaurire la memoria.

Problemi correlati