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.
L'object AmountComputed est créé et l'objet tra est mis à jour dans la boucle. J'utilise quartz pour le batch.
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(); } }
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
Partager