Ajuda - Configuração Hibernate [RESOLVIDO]

9 respostas
B

Boa tarde pessoal a minha dúvida é a seguinte

Tenho uma base com cerca de 100 tabelas e vários campos nas tabelas…

Criei as entidades através do utilitário do netbeans (Criar entidades do banco de dados), as classes foram geradas tudo certinho com annotations jpa… e tudo mais… Configurei o hibernate.hbm com o mapeamento das classes e a conexão JDBC (SQL SERVER). E, por fim, uma página que apresenta uma listagem de registros de uma determinada tabela.

Funciona, porém com uma extrema lentidão, toda vez que se recarrega a página. O que eu percebi no console é que toda vez que a página é recarrega, o hibernate recria os mapeamentos de todas as tabelas.

Isso está correto? Tentei criar uma classe com HibernateUtil para pegar sessões, mais mesmo assim nada funciona!

Se puderem me ajudar!

9 Respostas

marcelo.bellissimo

Essa página está carregando dados do banco, não está?

Como você está fazendo as consultas? poste um exemplo da sua lógica… isso deve ser algum problema com a sua sessão…

B

A página carrega sim os dados do banco (uma listagem simples de uma tabela)

Criei um DAO Genérico

@SuppressWarnings("unchecked")
	public List<T> list() {
		logger.info("Listando todos");
    	return session.createCriteria(persistentClass).list();
    }

e a implementação do método

public List<Assinante> lista() {
        sf = new AnnotationConfiguration().configure().buildSessionFactory();
        session = HibernateUtil.openSession();
        tx = session.beginTransaction();

        assinanteDAO = new AssinanteDAO(session, Assinante.class);

        List<Assinante> assinantes = this.assinanteDAO.list();
        tx.commit();
        
        session.close();

        return assinantes;
    }
a classe HibernateUtil
private static final Logger logger = Logger.getLogger(HibernateUtil.class);
    private static final SessionFactory sessionFactory;
    private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();

    static {
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    public static Session openSession() {
        if (sessions.get() != null) {
            logger.error("There was a session for this thread already!! ");
            // grave, alguem nao fechou uma sessao ja aberta!
        }
        sessions.set(sessionFactory.openSession());
        System.out.println("openSession");
        return sessions.get();
    }

    public static void closeCurrentSession() {
        sessions.get().close();
        sessions.set(null);
    }

    public static Session currentSession() {
        return sessions.get();
    }

    public static SessionFactory getSessionFactory() {
        System.out.println("getSessionFactory");
        return sessionFactory;
    }

sempre que eu carrego a página... ele recria os mapeamos (eu acho que a palavra é essa) e lota o console de INFO

16:00:38,537 INFO Configuration:1426 - configuring from resource: /hibernate.cfg.xml
16:00:38,538 INFO Configuration:1403 - Configuration resource: /hibernate.cfg.xml
16:00:38,541 INFO Configuration:1541 - Configured SessionFactory: null
16:00:38,544 INFO AnnotationBinder:418 - Binding entity from annotated class: Assinante
16:00:38,545 INFO QueryBinder:64 - Binding Named query: Assinante.findAll => SELECT a FROM Assinante a
16:00:38,586 INFO EntityBinder:424 - Bind entity Assinante on table TASSINANTE
16:00:38,589 INFO AnnotationBinder:418 - Binding entity from annotated class: Cidade
16:00:38,590 INFO QueryBinder:64 - Binding Named query: Cidade.findAll => SELECT c FROM Cidade c
16:00:38,590 INFO EntityBinder:424 - Bind entity Cidade on table TCIDADE

marcelo.bellissimo

Estou sem ambiente aqui pra testar, mas pelo que eu me lembro, é até normal o Hibernate recriar os mapeamentos… eu acho que o problema da sua lentidão é o Log no console, pois como existem muitas tabelas, vai gerar muito log, e a página só vai carregar depois que terminar de “imprimir” o log no console… tenta desabilitar o log e veja se melhora o desempenho…

B

Marcelo

já fiz esse teste, o porém é que o problema se agrava com muitas requisições dessa página.
Ela aloca memória e não desaloca… Chega um momento que dah Java heap space… Já aumentei a memória de heap, mais com isso eu só estou levando esse problema para frente, quando o número de conexões aumentar.

marcelo.bellissimo

Bem, nesse casos, algumas coisas a considerar são:

1- Usar um cache de segundo nível, mas não use aquele C3P0 que vem com o Hibernate…

2- Dar uma lida nessa seção da documentação, tem umas dicas boas:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html

B

Ok… obrigado pela ajuda…

Dei uma olhada no link, mais isso não é uma performance de acesso a banco/dados…

Acho que estou esquecendo de alguma coisa… Fechar, encerrar algum objeto.

Pois a cada nova visita a página o java aloca mais e mais memória, até estourar. isso não deve ser normal.

Att
Tiago

marcelo.bellissimo

Essa linha aqui do seu código:

public List&lt;Assinante&gt; lista() { sf = new AnnotationConfiguration().configure().buildSessionFactory();

É necessária nesse ponto ?

B

Kra, removi essa linha de código. e Resolvido!!!

muito Obrigado pela força ai!

marcelo.bellissimo

Opa, disponha… mas caracas, não sei como não vi ela antes… viajei! :smiley:

Criado 15 de janeiro de 2010
Ultima resposta 15 de jan. de 2010
Respostas 9
Participantes 2