List do session criteria do hibernate estourando heap!

9 respostas
C

Bom dia pessoal!!

Estou com o seguinte problema…
Eu faço acesso a um arquivo Access via ponte JDBC-ODBC…a conexão funciona perfeitamente e tals…
tenho um metodo numa classe DAO que me retorna uma list:

public List<T> listaTudo() {
		/**
		 * Método que lista todos os Eventos do arquivo mdb,
		 * 
		 */
		return this.session.createCriteria(this.classe).list();
	}

mas este método esta estourando meu heap size…o eclipse já esta abrindo com 200MB e o javaw da aplicaçao chega a 115MB e estoura…nao tenho muito como aumentar isso…e não consegui ver onde possa estar vazando…

A tabela Access é simples sem relacionamentos…tem 13 atributos… e 130 000 entradas…
Quando acesso outros arquivos menores vai tranquilo…

Em uma manobra porca eu tentei pegar de um em um…
como eu já tinha um metodo procura(int):

public T procura(Long l) {
		return (T) this.session.load(this.classe, l);
	}

e fiz um for pra ver ond estoura…e estoura com 68000 entradas rodadas…
Tentei ver se tinha mto objeto sendo largado…mas…o codigo ta bem simples…os objetos da lista nao estao referenciados…deveriam ir pro garbage colector…eu acho…hehe

DAO<Event> dao = new DAOFactory(new Event())
				.getHibernateEventAccessDAO();
		
		for (int i = 1; i < dao.getLastAccessEvent(); i++) {
			System.out.println(dao.procura(i));

		}

Alguem tem alguma luz?
Valeu!!!
[]s

9 Respostas

qmx

o problema é que estes objetos não vão ser coletados porque a própria session do hibernate está referenciando eles.

usa a paginação do hibernate (setFirstResult, setMaxResult?)

C

qmx,
Cara eu sou beginner no hibernate…
como eu faço um metodo que mostre paginado?
tipo trocando pelo meu procura que eu coloquei acima?
vlw!

C

tipo assim??

public List<Entidade> buscaEntidade(String nome, String ordenar, Integer paginar){
 List entidades = session.createCriteria(Entidade.class)
     .add( Restrictions.or(
    		Restrictions.ilike("nome"	 , "%" + nome.toLowerCase() + "%"),
     		Restrictions.ilike("fantasia", "%" + nome.toLowerCase() + "%")
      ))
     .addOrder( Order.desc(ordenar) )
     .setMaxResults(50)
     .setFirstResult(paginar)
     .list();
 return entidades;
 }
C

tipo quase funcionou…
eu setei max pra 20 por exemplo
e peguei o firstResult vindo da chamada do metodo…
dai ele lista de 1…20

listaPagina(1) --> 1…21
listaPagina(2) --> 1…22

eu queria virar mais 20…

listaPagina(2) --> 21…40

L

Faz algo como:

setMaxResults(20)  
setFirstResult((pagina - 1) * 20)
C

e para fazer o controle do loop?
tem algo mais refinado?
eu pensei em algo assim:

Boolean hasMorePages = true;
while(hasMorePages){
	int i = 1;
	try{
		List<Event> list = dao.listaPagina(i);
	}catch(GenericJDBCException e){
		e.printStackTrace();
	}
	for (Event event : list){
		System.out.println(event);
	}
	if(list.size()!=20){
		hasMorePages = false;
	}
	i++;
}

meio feio…tem como saber o numero de paginas via hibernate?

ah mto obrigado pelas respostas!!

C

Olha eu tinha feito o seguinte gato…

for (int i = 1; i <= dao.getLastAccessEvent(); i++) {
	System.out.println(dao.procura(i));
	dao.getSession().clear();
}

assim ele pega o cara especifico de um em um…e ja limpa a sessao…claro q soh exibi o cara…nao
fiz mais nada…mas foi mais rapido do q paginacao…

qq vo6 acham?

L

Se entedi bem, vc esta buscando um a um?!
Se for isso não acho uma boa idéia, coitado do seu banco de dados heheh

Eu usaria paginação, a forma como vc faz o looping ai vc decide, pode dar um count antes, controlar qdo não vier mais os X registros que vc busca, enfim, vc que decide.
Caso se interesse, eu publiquei a muito tempo atras algo que pode te ajudar:

C

luBS,
Eu também não acho uma boa ideia…hahaha
o problema é que paginando ele está demorando muito pra me retornar a query…
um-a-um ta em torno de 20x mais rapido…

alias, eu li seu post…bem legal ein…

agora não sei se tenho problema no código…
por ser simples até acho q não…

mas estou aberto a sugestoes!!
vlw!

Criado 4 de março de 2009
Ultima resposta 5 de mar. de 2009
Respostas 9
Participantes 3