Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserção ou atualização em massa com o Hibernate?


Existem muitos gargalos possíveis nas operações em massa. A melhor abordagem depende muito da aparência dos seus dados. Dê uma olhada no Manual do Hibernate seção sobre processamento em lote.

No mínimo, certifique-se de estar usando o seguinte padrão (copiado do manual):
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();

Se você estiver mapeando um arquivo simples para um gráfico de objeto muito complexo, talvez seja necessário ser mais criativo, mas o princípio básico é encontrar um equilíbrio entre enviar pedaços de dados de bom tamanho para o banco de dados a cada liberação/commit e evitar explodindo o tamanho do cache de nível de sessão.

Por fim, se você não precisar que o Hibernate lide com nenhuma coleção ou cascata para que seus dados sejam inseridos corretamente, considere usar um StatelessSession .