| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/07/2010 18:12:06
|
furacao123
GUJ Ranger
![[Avatar]](/images/avatar/f2dc8351dbd57c759aebf55e53876289.jpg)
Membro desde: 24/01/2008 22:05:47
Mensagens: 794
Offline
|
Aew galera
Estou com uma duvida no JPA, estou desenvolvendo para Desktop, onde duas aplicações acessam o mesmo banco de dados simultaneamente, por isso nao posso utilizar o cache de 1 nivel do Hibernate, e para atualizar os meus selects eu estou dando um clear sempre no inicio dos metodos de select no meu GenericDAO, mas assim gera um problema pois tenho por exemplo um objeto NFiscal com varios relacionamentos que sao populados com LAZY, mas em um mesmo instante do codigo preciso dar um select para pegar a NFiscal e outro objeto a partir dae perco a sessao e nao consigo pegar os objetos relacionados com NFiscal
Por exemplo
Aqui populo meu objeto NFiscal
e logo abaixo
depois disso se eu tentar buscar
por exemplo vai me gerar uma Exception pois eu dei um clear na sessao ao buscar estados e o relacionamento esta com Lazy
O que voces me recomendam a melhor pratica de programaçao para resolver esse problema, passar a utilizar EAGER (mas assim em casos que funcionaria normalmente com Lazy, e que nao precisaria popular todos relacionamentos vou ter perda de desempenho) nos relacionamentos, continuar com LAZY mas chamar os getObjeto que vou precisar e assim executar os selects e popular objetos auxiliares...?
Segue um metodo de busca no meu GenericDAO
Obrigado.
This message was edited 1 time. Last update was at 07/07/2010 18:14:07
|
Q8200 | Intel DG35EC | 4GB Kingston 800 |HD Seagate 250 GB SATA | HD Seagate 160 GB SATA | Monitor LG 22'' | Fonte AKASA 350W | GeForce 9600 GT
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 09:40:20
|
partenon
JavaChild
Membro desde: 27/06/2010 15:08:10
Mensagens: 103
Localização: Brno, Czech Republic
Offline
|
A primeira coisa eh remover o "clear" de dentro destes metodos. Pode parecer correto fazer isso dentro do DAO, mas no seu caso, vc precisa de alguem numa camada acima para coordenar esta limpeza.
Dependendo da frequencia que vc espera que os seus usuarios atualizem um mesmo registro, vc pode tanto dar um refresh no objeto antes de mostra-lo na tela ou vc pode utilizar um metodo de optimistic locking e dar um catch na excecao quando houver uma tentativa de atualizacao em um registro "velho".
|
http://www.google.com/profiles/partenon |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 10:10:16
|
furacao123
GUJ Ranger
![[Avatar]](/images/avatar/f2dc8351dbd57c759aebf55e53876289.jpg)
Membro desde: 24/01/2008 22:05:47
Mensagens: 794
Offline
|
ja tentei utilizar o refresh no objeto mas isso gera uma perda de desempenho maior ainda pois uma lista de 1000 registros de NFiscal por exemplo pra cada refresh ele varre todos os relacionamentos e popula como se fosse por EAGER os objetos, a melhor maneira que encontrei ate agora foi chamar o remove e passar null como parametro e tratar a excessao com isso nao perco qse nada de desempenho e minha sessao fica aberta normalmente e o cache de 1 nivel fica limpo.
Agora sobre optimistic locking vou dar uma pesquisada pois nunca vi nada sobre o assunto, se tiver como me passar algumas informações agradeço.
Obrigado.
|
Q8200 | Intel DG35EC | 4GB Kingston 800 |HD Seagate 250 GB SATA | HD Seagate 160 GB SATA | Monitor LG 22'' | Fonte AKASA 350W | GeForce 9600 GT
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 10:14:39
|
partenon
JavaChild
Membro desde: 27/06/2010 15:08:10
Mensagens: 103
Localização: Brno, Czech Republic
Offline
|
pois uma lista de 1000 registros de NFiscal por exemplo pra cada refresh ele varre todos os relacionamentos e popula como se fosse por EAGER os objetos
Agora fiquei curioso... Pq vc esta usando "clear"? Como prevencao de problemas, ou pq vc realmente precisa?
|
http://www.google.com/profiles/partenon |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 10:17:12
|
furacao123
GUJ Ranger
![[Avatar]](/images/avatar/f2dc8351dbd57c759aebf55e53876289.jpg)
Membro desde: 24/01/2008 22:05:47
Mensagens: 794
Offline
|
fiz como voce me falou tratei o clear na sessao um nivel acima dentro do meu DaoImp ao buscar nota limpo a sessao ja em estados nao limpo a sessao, vou fazer testes, aqui eu uso o Entity + Dao + Service no meu dao tenho total acesso ao EntityManager pois dou extends em GenericDao, demorei pra perceber mas esse clear na sessao nao é generico e nao deve ficar em GenericDao...
finalizando os testes eu posto o resultado...
|
Q8200 | Intel DG35EC | 4GB Kingston 800 |HD Seagate 250 GB SATA | HD Seagate 160 GB SATA | Monitor LG 22'' | Fonte AKASA 350W | GeForce 9600 GT
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 10:19:14
|
furacao123
GUJ Ranger
![[Avatar]](/images/avatar/f2dc8351dbd57c759aebf55e53876289.jpg)
Membro desde: 24/01/2008 22:05:47
Mensagens: 794
Offline
|
Entao eu uso o clear pois varias aplicações acessam o banco simultaneamente, e se eu nao dou um clear, refresh ou alguma transação de insert, update ou remove o hibernate guarda os valores dos objetos em cache de 1 nivel e assim nao consigo pegar as alterações no banco de dados feitas por outras aplicações, como por exemplo uma mudança de status em uma NFiscal quando dou o select ele popula pelo cache de 1 nivel assim nao tenho os valores reais
This message was edited 1 time. Last update was at 08/07/2010 10:20:01
|
Q8200 | Intel DG35EC | 4GB Kingston 800 |HD Seagate 250 GB SATA | HD Seagate 160 GB SATA | Monitor LG 22'' | Fonte AKASA 350W | GeForce 9600 GT
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/07/2010 10:41:13
|
furacao123
GUJ Ranger
![[Avatar]](/images/avatar/f2dc8351dbd57c759aebf55e53876289.jpg)
Membro desde: 24/01/2008 22:05:47
Mensagens: 794
Offline
|
agora funcionou certo tratando o clear no Dao (1 nivel a cima)
mas estou curioso para aprender mais alternativas como voce disse
partenon wrote:metodo de optimistic locking e dar um catch na excecao quando houver uma tentativa de atualizacao em um registro "velho"
Obrigado.
|
Q8200 | Intel DG35EC | 4GB Kingston 800 |HD Seagate 250 GB SATA | HD Seagate 160 GB SATA | Monitor LG 22'' | Fonte AKASA 350W | GeForce 9600 GT
|
|
|
 |
|
|