Olá amigos, fiz um programa simples em Java Desktop usando o hibernate acessando uma base Oracle, o sistema lê um arquivo csv, com 500000 linhas, onde estas linhas contém a chave da NFe, com esta chave faço um sql na tabela de notas requisitando o status dela na base.
Para ganhar performance eu realizo um select a cada 1000 linhas, ou seja fica algo parecido com isso SELECT STATUS FROM NOTA N WHERE N.CHAVE IN(…), onde dentro do IN eu coloco mil chaves para realizar a busca.
Com esta ideia eu vou realizar 500 sqls, onde cada um vai possuir 1000 chaves.
O problema é que durante o processo, a aplicação vai cada vez mais consumindo memoria, até chegar em um ponto onde ela esta com 250mb de memoria utilizada, o que faz ela parar, e o mais estranho não é gerado nenhum exception.
Removi o Hibernate e coloquei uma conexão JDBC pura, tudo vai bem, o processo é todo executado usando 30mb de memoria ram.
Resolvi o problema usando o JDBC puro, mas fiquei na duvida do porque este problema ocorre no hibernate, sendo que a cada SQL eu chamo o session.clear para que seja lmpa da sessão as informações do sql.
repito este código a cada 1000 linhas, ou seja 500 vezes.
try{
session = Principal.sessionFactory.openSession();
query = session.createSQLQuery(sql.toString());
query.setTimeout(120);
res = query.list();
....
...
...
}catch(Exception e){
} finally {
if (session != null) {
session.clear();
session.close();
}
}