Java >> Java opplæring >  >> Tag >> hibernate

Masseinnsetting eller oppdatering med Hibernate?

Det er mange mulige flaskehalser i bulkoperasjoner. Den beste tilnærmingen avhenger sterkt av hvordan dataene dine ser ut. Ta en titt på Hibernate Manual-delen om batchbehandling.

Pass på at du som et minimum bruker følgende mønster (kopiert fra håndboken):

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

Hvis du kartlegger en flat fil til en veldig kompleks objektgraf, må du kanskje bli mer kreativ, men den grunnleggende prinsippet er at du må finne en balanse mellom å skyve store biter av data til databasen med hver flush/commit og unngå eksploderer størrelsen på cachen på øktnivået.

Til slutt, hvis du ikke trenger Hibernate for å håndtere innsamlinger eller kaskade for at dataene dine skal settes inn riktig, bør du vurdere å bruke en StatelessSession.


Fra Hibernate Batch ProcessingFor oppdatering brukte jeg følgende:

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

ScrollableResults employeeCursor = session.createQuery("FROM EMPLOYEE")
                                   .scroll();
int count = 0;

while ( employeeCursor.next() ) {
   Employee employee = (Employee) employeeCursor.get(0);
   employee.updateEmployee();
   seession.update(employee); 
   if ( ++count % 50 == 0 ) {
      session.flush();
      session.clear();
   }
}
tx.commit();
session.close();

Men for å sette inn ville jeg gå for jcwayne svar


Ifølge et svar på et lignende spørsmål, kan det gjøres ved å konfigurere Hibernate til å sette inn objekter ved å bruke en egendefinert lagret prosedyre som bruker databasens upsert-funksjonalitet. Det er imidlertid ikke pent.


Java Tag