Bonjour à tous,

j'ai créé un batch qui fait un insert et un update sur environ 150'000 données. J'ai regardé les bonnes pratiques en matière de batch avec hibernate, notamment le scrollable results, le flush/clear chaque 50 enregistrements et le hibernate.batch_size.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ScrollableResults transactions = transactionDao.getTransactionsListBetweenTwoDate(start, end, isTradeDate, dateType);
while (transactions.next()) {
	Transaction tra = (Transaction) transactions.get(0);
	AmountComputed ac = createAmountComputed(tra);
	// traitement
	tra.setAmountComputed(ac);
	if(ac.getUid()==null) {
		amountComputedDao.create(ac);
		created++;
	}
	else {
		amountComputedDao.update(ac);
		updated++;
	}
	if(++count % 50 == 0 ) {
		log.info("Flush and clear hibernate session, count "+count);
		//flush a batch of updates and release memory:
		transactionDao.getSession().flush();
		transactionDao.getSession().clear();
	}
}
L'object AmountComputed est créé et l'objet tra est mis à jour dans la boucle. J'utilise quartz pour le batch.

Malheureusement j'ai une erreur out of memory (512mo de mémoire sur la jvm). En analysant le heap dump j'ai une accumulation d'objets org.hibernate.action.EntityUpdateAction et org.hibernate.action.EntityIdentityInsertAction... Je n'arrive pas à comprendre ce que je fais faux.

Merci d'avance et excellent après-midi