Problemas com Hibernate e Glassfish
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.
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
Curtidas 0
Respostas
Dyego Carmo
09/01/2011
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 :)
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 :)
GOSTEI 0
José Filho
09/01/2011
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
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
GOSTEI 0
Davi Costa
09/01/2011
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
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
GOSTEI 0
José Filho
09/01/2011
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:
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:
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:
com certeza tem alguma coisa errada;
alguma dica?
Grato
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
GOSTEI 0
Davi Costa
09/01/2011
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
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
GOSTEI 0
Dyego Carmo
09/01/2011
Olá , alguma novidade sobre o pedido ?
GOSTEI 0
José Filho
09/01/2011
Oi Dyego, desculpe a demora, estou fazendo alguns testes;
Obrigado.
Obrigado.
GOSTEI 0