Boa tarde pessoal, estou com o seguinte problema preciso ler uma tabela que tem cerca de 700 mil registros e passar esses dados para uma outra tabela. Pra fazer isso eu utilizei os métodos setFirstResult e setMaxResults do hibernate, onde firstResult começa em zero e vai incrementando em 25000 passo o número máximo tbm como 25000, ou seja, busco do registro 0 a 24999, depois de 25000 a 49999 e por ai vai.
isso está dentro de um loop e quando chega na quarta iteração do loop, ou seja, carreguei e inseri 75000 registros ocorre erro de java.lang.OutOfMemoryError
Não consigo entender o pq disso uma vez que os resultados estão “paginados”.
Segue o trecho do loop:
totalInsert = this.total.countInsert();
do {
list.clear();
list= this.packingListDao.findInsert(
firstResult, 25000);
for (PackingListItem packingListItem : list){
count++;
total++;
// alguns new
// algumas buscas em bds
// e os insert dos dados nas novas tabelas
// atribuição de null para objetos que foram criados com o new
}
firstResult += 25000;
System.gc();
} while (count != totalInsert);
e o trecho do dao
@SuppressWarnings("unchecked")
public List<PackingListItem> findInsert(final int firstResult,
final int maxResult) throws Exception {
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
String query = " from PackingListItem as packing where not "
+ " exists ( select 1 from DpPackListItem as dp where "
+ " dp.cdSExport = packing.cdPackingItem "
+ " and dp.cdSExport = packing.cdPackingList )";
Query sqlQuery = session.createQuery(query);
sqlQuery.setMaxResults(maxResult);
sqlQuery.setFirstResult(firstResult);
return sqlQuery.list();
}
});
}