Não sei se há como configurar o cache do hibernate.
Eu tive problemas de carregar muitos objetos, e objetos complexos, em uma messa sessão. Algo do genero:
for (int i = 0; i <= lstIdPessoa; i++) {
Integer idDaPessoa = lstIdPessoa.get(i);
Pessoa pessoa = sessaoDoHibernate.get(Pessoa.class, idDaPessoa);
//efetua operações com pessoa
}
No fim do bloco a referencia pessoa deixa de existir e o objeto pessoa pode ser coletado pelo garbage collector, certo? Errado. O objeto para o qual pessoa apontava contina referenciado pela sessaoDoHibernate, e o uso de memória cresce consideravelmente, dependendo do tamanho do objeto pessoa e da quantidade de pessoa, claro.
Dessa forma o tempo de execução do código seguia uma pg.
Resolvemos o problema desassociando pessoa da sessaoDoHibernate assim:
for (int i = 0; i <= lstIdPessoa; i++) {
Integer idDaPessoa = lstIdPessoa.get(i);
Pessoa pessoa = sessaoDoHibernate.get(Pessoa.class, idDaPessoa);
//efetua operações com pessoa
sessaoDoHibernate.evict(pessoa);
}
Com isso o tempo de execução diminuiu, em função do uso melhor da memória.