Fórum Problemas com Hibernate e Glassfish #393524

09/01/2011

0

Bom dia,

estou participando de uma equipe de desenvolvimento de um sistema web, utilizando: Netbeans, Glassfish, EJB, JSF2, Hibernate, JPA2.
há alguns dias, passamos há fazer o deploy para o servidor onde realmente ficará o sistema, e notei alguns problemas:
1. Em um formulário, utilizado dentre outras coisas, para gerar boletos em pdf, quando clico no botão, ele não gera o pdf, tb não dá erro, ele processa e fica na tela; localmente em qualquer uma das máquinas dos integrantes da equipe, o pdf abre normalmente; já coloquei o Modelo do pdf - necessário para geração, dentro do diretório domain1, já tentei(digo isso pq não sei se realmente estou olhando no lugar certo) visualizar o arquivos de log, mas não encontro nenhum erro relacionado. O que pode ser?
2. Quando tenho form's q possuem relacionamentos, estamos detectando demora nas operações, de pesquisa, salvamento, etc. O q notamos é q em situações tipo, um cliente q possui várias compras, essas compras possuem itens, essa entidade de itens se relaciona com produtos, com estoque, etc, se faço uma pesquisa pelo cliente somente para q me relacione as compras e somente as compras - não quero saber os itens de cada compra, há não ser q clique em detalhar compra - ele faz várias sql's, várias não, um monte, incluindo todos os relacionamentos diretos e indiretos e acho q isso está causando essa demora;
Nas listas(ex. compras do cliente), estamos utilizando Hibernate.initialize, pois, caso contrário, dá erro de lazyinitializationexception - e acho q isso é a mesma coisa de se trabalhar com eager, o q não é nada bom;
Em algumas telas, optamos por sql nativo nas pesquisas e realmente houve uma melhora de 100%, no entanto em algum momento precisamos transformar um dos itens da lista em um objeto da entidade, para salvar por exemplo e ai, ele faz os sql's monstruosos e vem a demora.
É isso, não sei se expliquei bem, mas, se alguém puder me ajudar, explicarei o quanto for necessário.

Desde já, agradeço a todos.  
José Filho

José Filho

Responder

Posts

11/01/2011

Dyego Carmo

Olá !

Gostaria de saber mais alguns detalhes...

O que seria esta demora ? quanto tempo ?

Voce chegou a habilitar o sohw_sql do hibenate para saber o que ele esta fazendo no banco ?

Cole aqui um exemplo do seu codigo de salvamento...

detalhe melhor sua duvida numero 1 :)
Responder

Gostei + 0

11/01/2011

José Filho

Oi Dyego,

a demora é bem grande, mais de 20 segundos, isso em rede local, imagina na web;
habilitei sim o show_sql e ele faz um montão de consultas;
acredito Dyego, q o problema principal, é q não estamos sabendo trabalhar com o lazy nos relacionamentos *toMany, sempre q nos deparamos com o LazyInitializationException, já colocamos o Hibenate.initialize na coleção, acredito q isso é praticamente a mesma coisa q um EAGER, o que não é nada bom, estou certo?
Já li algumas coisa sobre Open Session In View, mas quando se trabalha com EJB, q é o nosso caso, é a mesma coisa implementação?

Grato


Responder

Gostei + 0

12/01/2011

Davi Costa

Só uma sugestão:
o que o lazy faz n é só gerar a consulta qdo vc precisar, então onde der LazyInitializationException, vc n faz o getAttribute direto, mas realiza essa consulta, o que a nível de performance vai dar no mesmo. Porém, obviamente, vai ter um retrabalho de implementação. Passei algumas vezes por isso e gosto de adotar essa estratégia, tudo em nome da performance.

Espero ter ajudado

Att Davi
Responder

Gostei + 0

18/01/2011

José Filho

Oi Davi, fiz algumas alterações, mas acho q ficou na mesma:

na entidade pessoa(classe pai de Profissional, Empresa, Leigo), eu tenho uma método que retorna suas anuidades:

    @OneToMany(mappedBy = "pk.pessoa")
    @OrderBy("pk.exercicio")
    public List<Anuidade> getAnuidades() {        
        if (this.anuidades == null) {
            this.anuidades = new ArrayList<Anuidade>();
        }
        return anuidades;
    }


anteriormente tinha o Hibernate.initialize na primeira linha, mas como pode ver, foi retirado, ficando assim, Lazy, dessa forma, quando pego alguma pessoa, com certeza tenho o erro de LazyInitializationException;

estou criando métodos nos dao's, como esse de profissional:
    public Profissional profissionalCompleto(String codigo) {
        Profissional profissional = pesquisarPorId(codigo);
        Hibernate.initialize(profissional.getAnuidades());
        Hibernate.initialize(profissional.getCargosHonorificos());
        Hibernate.initialize(profissional.getEntidadesClasses());
        Hibernate.initialize(profissional.getArts());
        Hibernate.initialize(profissional.getArtsWeb());
        Hibernate.initialize(profissional.getEnderecosPessoas());
        Hibernate.initialize(profissional.getTitulos());
        Hibernate.initialize(profissional.getPosgraduacoes());
        Hibernate.initialize(profissional.getBoletos());
        Hibernate.initialize(profissional.getEventos());
        Hibernate.initialize(profissional.getProtocolos());
        Hibernate.initialize(profissional.getResponsabilidadesTecnicas());
        Collections.sort(profissional.getResponsabilidadesTecnicas(), comparator);
        
        return profissional;
    }



 de tal forma, que quando vou capturar um profissional, passo o código e ele inicializa as listas, ai não dá erro de lazy; está funcionando, no entanto, hj fiz testes de alteração na entidade Empresa, e a demora foi mais de 5 minutos e gerou mais de 500.000 linhas de sql, isso mesmo, uma barbaridade, o código no empresaDao tá assim:
    public Empresa empresaCompleta(String codigo) {
    Empresa empresa = pesquisarPorId(codigo);
    Hibernate.initialize(empresa.getAnuidades());
    Hibernate.initialize(empresa.getArts());
    Hibernate.initialize(empresa.getArtsWeb());
    Hibernate.initialize(empresa.getEnderecosPessoas());
    Hibernate.initialize(empresa.getBoletos());
    Hibernate.initialize(empresa.getEventos());
    Hibernate.initialize(empresa.getProtocolos());
    Hibernate.initialize(empresa.getResponsaveis());
    Hibernate.initialize(empresa.getSocios());
    Collections.sort(empresa.getResponsaveis(), comparator);

    return empresa;
    }


com certeza tem alguma coisa errada;

alguma dica?

Grato
Responder

Gostei + 0

19/01/2011

Davi Costa

Posso estar enganado,
mas não me parece fazer muito sentido seus métodos de pesquisa.
Se pessoa é o pai, vc deve passar a pessoa como parâmetro.
E seria bem melhor vc usar um crietria que faria um select só para retorna os filhos de pessoa.
Como vc consegue o código dos filhos se está dando o LazyInitializationException??


Att Davi
Responder

Gostei + 0

26/01/2011

Dyego Carmo

Olá , alguma novidade sobre o pedido ?

Responder

Gostei + 0

26/01/2011

José Filho

Oi Dyego, desculpe a demora, estou fazendo alguns testes;

Obrigado.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar