[Resolvido] Hiberta processamento em lote/Lista objetos

2 respostas
javahibernate
H

Estou com um problema na execução de uma lista de objetos, ao processar essa lista de objetos
queria salvar os objetos da lista em lote assim como diz a documentação do hibernate:

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

processarCustomer(session, customer);
}

tx.commit();

session.close();

private processarCustomer(Session session, Customer customer){
try{

session.save(customer);
}catch(Exception e){
	//Caso ocorra alguma falha em persistir o objeto não falhar o lote de procesasmento
	//Continuar processeguindo o processamento dos demais customers sem dar rollback na transacao
}

}

Porém se eu realizar dessa forma, caso ocorra um erro na hora de gravar um objeto entre o lote, só consegui
dando um rollback na transacao inteira, perdendo os outros dados já gravados.
Queria algo para continuar processando o lote, mas ignorar um dos objetos com falha entre esse lote.

Se eu abrir uma transação para cada objeto, o processamento fica muito lento, algumas sugestões?!

2 Respostas

L

Qualquer exceção durante a transação vai forçar um rollback, isso é inevitável. Ao invés de tentar tudo dentro de uma transação só, ou uma transação por registro, você pode dividir a lista em blocos e fazer uma transação para cada bloco.

Se você pode, programe de forma defensiva. Antes de salvar, você pode checar as condições de potencial erro e evitar o rollback.

H

Resolvi com uma sugestão do amigo!
obrigado

Criado 23 de junho de 2017
Ultima resposta 5 de jul. de 2017
Respostas 2
Participantes 2