Diferença no tempo de retorno list Hibernate

5 respostas
R

Pessoal,

Alguém saberia me explicar o porque da diferença no tempo de resposta da execução desses dois DAOS , os dois trazem uma lista da mesma tabela porém o segundo tem mais filtros e é o mais rápido.

Esse retorna lista com 22 segundos

public List<Movimento> getMovimentoUa(int cdUa) throws Exception {

		try {

			this.session = HibernateUtil.getSessionFactory().openSession();
			this.tx = this.session.beginTransaction();

			Criteria criteria = this.session.createCriteria(Movimento.class)
					.add(Restrictions.eq("cdUa.cdUa", cdUa));

			return criteria.list();

		} catch (Exception e) {

			e.printStackTrace();

			throw new Exception();

		}
	}

Esse método retorna a lista com 3 segundos

public List<Movimento> getMovimentoUaSemJustif(int cdUa, int cdPeriodo,
			BigDecimal vlDesvioMin, BigDecimal vlDesvioNeg,
			String colVlDesvioAberto) throws Exception {

		try {

			this.session = HibernateUtil.getSessionFactory().openSession();
			this.tx = this.session.beginTransaction();

			Criterion maior0 = Restrictions.gt(colVlDesvioAberto, vlDesvioMin);
			Criterion menor0 = Restrictions.lt(colVlDesvioAberto, vlDesvioNeg);

			Criteria criteria = this.session.createCriteria(Movimento.class)
					.add(Restrictions.eq("cdUa.cdUa", cdUa)).add(
							Restrictions.or(maior0, menor0));

			DetachedCriteria desvio = DetachedCriteria.forClass(Desvio.class)
					.setProjection(Property.forName("idMovimento")).add(
							Restrictions.eq("cdPeriodo.cdPeriodo", cdPeriodo));

			criteria.add(Property.forName("idMovimento").notIn(desvio));

			return criteria.list();

		} catch (Exception e) {

			e.printStackTrace();

			throw new Exception();

		}
	}

5 Respostas

fabiozanardi

Quantos registros são retornados no caso 1 e quantos no caso 2?

R

1º : 523 registros
2º: em media 30 registros

Essa lentidão no 1º caso aconteceu quando importei a base de produção no banco que antes trabalhava com 2.000 registros e agora trabalha com 27.000, eu tive problema até com estouro de memória com o Tomcat alterei para 1000Mb e mesmo assim a velocidade na resposta do caso 1 continua a mesma, já no caso doi manteve a velocidade.

Quando executo as consultas via banco a reposta é bem tranquila.

fabiozanardi

existem algum atributo Lazy nos models? se estiver como eager pode estar causando o problema

de repente a primeira está retornando 523 e cada um tem listas gigantes, por isso a consulta demora tanto.

se isso ocorrer tente mudar o relacionamento do atributo para @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)

se não for isso podemos continuar analizar

Hebert_Coelho

Pode ser também falta de índice no cdUa uma vez que a segunda consulta utiliza o idMovimento.

um Index no DB faz muita diferença na pesquisa.

fabiozanardi

Concordo também, acredito que deva tentar eliminar essas duas situações para continuarmos ver se pode ser outra coisa.

Criado 20 de dezembro de 2011
Ultima resposta 20 de dez. de 2011
Respostas 5
Participantes 3