Hibernate é lento?

11 respostas
andre_a_s

E ae pessoal :wink:

Estou desenvolvendo um sistema usando o Hibernate e reparei que ela está meio lento…
Se comparar com JDBC somente ele é bem mais lento mesmo…
Ai estava pensando… será o Hibernate uma boa pedida???
Pq isso pode ser um fator negativo neh…
O que acham?

11 Respostas

lcmetzger

Acredito que vc não esteja utilizando corretamente.

Como você está tratando as sessões?

andre_a_s

Eu desenvolvi com base de algum material que vi aqui no GUJ, algumas coisas que peguei no portal do Hibernate tbm…
Mas quando eu digo que é lento é assim…
Quando vou inserir algum registro no banco, preciso instanciar a classe DAO

AlunoDAO dao = new AlunoDAO();
dao.insert(meuObjetoDePersistencia);

Nessa hora percebo que ele demora um pouco, pois ele precisa mapear o XML e tal… não está muuuuito lento, mas comparado com JDBC normal está…
Se ficar acompanhando o console poderemos ver quanta coisa ele faz por trás…
Ele precisa mapear o XML, intrepretar o HQL, procurar os gets and sets… por isso digo que ele fica lento… :wink:

_fs

Entre no fórum do Hibernate.org que há várias dicas e erros comuns que podem deixar sua aplicação lenta.

Além de deixarem bem claro que testes “burros” (executar um parametro x vezes, medindo tempo com System.currentTimeMillis) não servem para avaliar a performance do Hibernate.

lcmetzger

Mostre o método insert de seu dao,
o problema pode estar ali.

:?

andre_a_s
public void insert(Mural mural) throws Exception{ 
		Session session = factory.openSession(); 
		session.save(mural); 
		session.flush(); 
		session.close(); 
	}

tem algum problema com ele? :frowning:

_fs

Esse método sozinho executado uma vez fica lento? Ou você está executando ele várias vezes?

_fs

post duplo … mouse de merda :expressionless:

andre_a_s

Uauhauha

Mas então… Executo somente uma vez…
E não é só no insert… no caso de um select tbm…

public List getList(String hql) throws Exception{ 
		Session session = factory.openSession(); 
		List murals = session.find(hql); 
		session.flush(); 
		session.close(); 
		return murals; 
	}

Como disse antes… não é nada absurdo o tempo que ele demora, mas deixa o portal um pouco mais lento né…

_fs

Algumas dicas e explanações gerais, talvez ajude:

http://forum.hibernate.org/viewtopic.php?t=926472
http://forum.hibernate.org/viewtopic.php?t=931708
http://forum.hibernate.org/viewtopic.php?t=931724

Aqui tem alguns artigos sobre performance:
http://www.hibernate.org/37.html

urubatan

pelo que eu entendi, o problema parece que é por que você esta criando sempre uma nova instancia do dao, e por algum motivo desconhecido, esta inicializando a engine do hibernate toda vez que cria uma nova instancia do dao.

o melhor seria inicializar a session factory apenas uma vez para a aplicação toda, e criar apenas uma session para cada vez que tu precisar de um dao novo.

andre_a_s

Valeu urubatan e Lipe…
Vou seguir a instrução de vcs :wink:

E tbm estou com um problema… eu não consigo fazer um maldito Inner join! :cry:

select * from mural m
inner join mural_students ms
on ms.id_mural = m.id_mural   
where ms.id_student=5

como posso fazer isso no Hibernate?
O que preciso alterar no XML e em qual XML eu preciso alterar?
Seria no Mural.hbm.xml?
Eu tento executar a query(ja convertida pra HQL) e ele fala que não acha a propriedade “ms”
Como deve ficar esse inner join em HQL???
E eu deve colocar alguma coisa a mais na minha classe Mural.java?

A assinatura da Mural.java esta assim:

public class Mural {	
	private String nm_mural;
	private String description;
	private int id_admin;
	private String ids;
	private int id_mural;
}

Eu devo colocar mais alguma coisa???

Criado 7 de julho de 2004
Ultima resposta 7 de jul. de 2004
Respostas 11
Participantes 4