| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 18:50:32
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
Boa tarde galera!
Estou com um baita problema. Desenvolvo um sistema para gerenciamento de um estúdio fotográfico utilizando swing e hibernate e banco de dados mysql. Tenho a aplicação instalada em dois computadores, o grande problema é que as alterações feitas em um computador não são acessadas pelo outro até que este encerre e inicie novamente a aplicação, ou seja, o sistema de cache do hibernate não "vê" estas alterações feitas em outro computador, o que é lógico, pois seria esperar demais que adivinhasse atualizações. Tentei desabilitar o sistema de caches do hibernate com o seguinte código:
Realmente não sei o que fazer para resolver este problema, se implemento uma comunicação entre as aplicações para que se avisem quando fizerem alterações e dar um flush (ou sei lá o que) no hibernate para ele elimitar os objetos em cache.
Espero que tenha sido claro em meu problema. Agradeço a atenção de todos.
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 18:59:25
|
Arcadex
JavaBaby
![[Avatar]](/images/avatar/c9088c2941113e230cc77.jpg)
Membro desde: 04/08/2004 15:20:37
Mensagens: 86
Localização: Vitória / Es
Offline
|
Nunca ouvi falar de um problema parecido.
Quer dizer que se por exemplo, você atualizar o cadastro de um cliente. Você troca o endereço e tel dele em um computador. Aí, logo depois você consulta os dados do cliente no outro computador e aparece os dados antigos ??
É esse mesmo seu problema ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 19:06:21
|
xgucax
JavaBaby
![[Avatar]](/images/avatar/d4ff76af57c1ebcc7eca3807b9a431a6.jpg)
Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline
|
Pelo que eu entendi, você não está utilizando o conceito de Transação do próprio Hibernate, ou vc está?
Experimente após cada ação, efeutar um commitTransaction().
Desse modo a base deve se alterada com os novos dados
Boa sorte
|
Embrace and extend this _|_
<hr> |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 19:06:46
|
velo
GUJ Ranger
![[Avatar]](/images/avatar/32b991e5d77ad140559ffb95522992d0.jpg)
Membro desde: 19/02/2004 18:23:55
Mensagens: 797
Localização: Jaraguá do Sul - SC
Offline
|
Pergunto....
Vc está comitando a transação?
Fechando a session?
Eu lembro de já ter visto algo assim.... tenta dar um session.flush() pra ver se resolve.
VELO
|
Use o melhor:
Linux para servidores
Macintosh para gráficos
Palm para mobilidade
Windows para jogar paciência
SCJP 5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/01/2007 19:11:03
|
Arcadex
JavaBaby
![[Avatar]](/images/avatar/c9088c2941113e230cc77.jpg)
Membro desde: 04/08/2004 15:20:37
Mensagens: 86
Localização: Vitória / Es
Offline
|
Mas se depois que ele reestarta a aplicação ele vê as alterações, parece n ser problema de controle de transação.... ou está com o autocommit = true ??? Nuh
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 13:33:27
|
xgucax
JavaBaby
![[Avatar]](/images/avatar/d4ff76af57c1ebcc7eca3807b9a431a6.jpg)
Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline
|
Provavelmente.
Mas será que o Hibernate não provê esse mecanismo? Commitar a transação quando o coletor tentar apanhar o objeto da sessão?
|
Embrace and extend this _|_
<hr> |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 15:38:09
|
Guerr@
Virtual Machine Man
![[Avatar]](/images/avatar/9fb640ea6abe0e849c8c1fd6eea97c22.jpg)
Membro desde: 03/12/2006 10:32:50
Mensagens: 520
Offline
|
Talvez o problema não seja com o hibernate mas com a arquitetura utilizada. Sugiro criar uma camada de negócios remota que seja acessada por ambas aplicações...
|
Eduardo Guerra - "É Java na ponta do dedo!"
Desenvolvedor de Frameworks - Pesquisador
Editor Chefe - Revista MundoJ
Professor - Instituto Tecnológico de Aeronáutica
Me siga no Twiter!!! http://twitter.com/emguerra |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 16:43:32
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
Olá galera... vamos aos códigos!
Tenho usado esta classe auxiliar para o hibernate:
Tenho o seguinte DAO para clientes:
As linhas session.flush() acrescentei-as a pouco para testar, mas não funcionou... Creio que o hibernate esteja mantendo as instancias já lidas em cache o que faz com que novas leituras (ClienteDAO.list(), por exemplo) não apareçam na outra aplicação aberta. E isto ocorre mesmo se rodar duas instancias de aplicação na mesma máquina.
Já to pensando seriamente em fazer uma camada de acesso remoto como indicou o Guerr@, mas o problema é que sou iniciante em Java e sei que tomarei uma surra tremendar...
Ouço falar de RMI e outras coisas referentes a objetos remotos... Acho que a solução seria algo neste sentido (isto claro se minha solução atual não funcionar mesmo).
Obrigado a todos.
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 16:50:20
|
mister__m
Virtual Machine Man
![[Avatar]](/images/avatar/89b9c689a57b82e59074c6ba09aa394d.jpg)
Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline
|
flaviomreis wrote:Já to pensando seriamente em fazer uma camada de acesso remoto como indicou o Guerr@, mas o problema é que sou iniciante em Java e sei que tomarei uma surra tremendar...
Ouço falar de RMI e outras coisas referentes a objetos remotos... Acho que a solução seria algo neste sentido (isto claro se minha solução atual não funcionar mesmo).
Embora eu acredite que seu problema imediato possa ser resolvido de outras formas, centralizar a camada de negócios num servidor de aplicação provavelmente é a melhor estratégia pro seu caso.
O genesis foi criado pra resolver justamente esse tipo de problema: criar aplicações desktop com backend enterprise. Ele torna tudo isso bem fácil e elimina a necessidade de você ter que conhecer RMI e afins. Na verdade, ele permite até mesmo a transição de um modo de execução local pra remoto de forma transparente, sem modificar nenhuma linha do seu código. Vale a pena conferir.
|
Michael Nascimento Santos, aka Mister M
Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 17:24:19
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
mister__m, desculpe a ignorância, ainda estou lendo a documentação do genesis, mas tu não terias algum exemplo simples de como utilizar o genesis para resolver meu problema do hibernate para que eu possa estudar/adaptar? Obrigado
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 17:57:08
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
Dei uma olhada superficial no genesis, mas me pareceu um pouco confuso, além de demonstrar-se ser um canhão para meu pequeno problema... Acho que vou partir para obtenção de objetos remotamente, utilizando uma aplicação só para servidor dados às minha aplicações finais.... Bora estudar objetos remotos...
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/01/2007 18:22:15
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
Bah... nada é fácil na vida ehehehe (que bom!)... Bom, existe como eu eliminar totalmente os caches do hibernate? Gostaria detestar isto antes de partir para outra solução, porque pelo que to vendo implementar um servidor de dados com RMI não é tão simples assim. Valeu!
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/01/2007 11:37:47
|
mister__m
Virtual Machine Man
![[Avatar]](/images/avatar/89b9c689a57b82e59074c6ba09aa394d.jpg)
Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline
|
Pelo que vi pelo seu código, o problema é que esse closeSession() não é chamado e você usa sempre a mesma Session. Tente resolver isso.
|
Michael Nascimento Santos, aka Mister M
Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/01/2007 13:19:13
|
xgucax
JavaBaby
![[Avatar]](/images/avatar/d4ff76af57c1ebcc7eca3807b9a431a6.jpg)
Membro desde: 07/10/2006 09:06:36
Mensagens: 92
Offline
|
que tal tentar executar o session.flush() e hibernateUtil.closeSession() após o save e update?
Não sei se foi seu caso, mas tem gente que pega essa classe no Hibernate In Action e simplesmente tenta usá-la na marra, sem saber o que está acontecendo a cada linha.
Tente realmente descarregar a sessão e posteriormente fechá-la. Teoricamente o hibernate é OBRIGADO a salvar os objetos no banco
Boa sorte
|
Embrace and extend this _|_
<hr> |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/01/2007 16:43:04
|
flaviomreis
Debugger
Membro desde: 04/07/2006 09:20:35
Mensagens: 56
Offline
|
Valeu mister__m e xgucax... alterei o método save e update conforme orientam e alterei-os:
Com ambos métodos chamados, a seguinte exceção ocorre ao tentar salvar a mesma instância duas vezes (clicar no botão de salvar duas vezes sem alterar nada, o que faz chamar o método ClienteDAO.update()...
A linha 32 de ClienteDAO.java é uma chamada à session.update(cliente).
Se retiro a chamada ao método closeSession() tudo funciona perfeitamente na aplicação, mas a outra instância da aplicação (digamos aplicação2) continua não "enxergando" as mudança, até que ela seja fechada e executada novamente(a aplicação2).... assim, creio que o problema não seja flush ou closeSession(), pois a sessão de uma aplicação, nada tem a ver com a sessão de outra... e se, como anteriormente, não chamando flush e closeSession(), ao simples reiniciar da aplicação2 fazia com que as mudanças aparececem, creio que seja um problema de cache.
Como rmi é um troço bem mais complicado do que eu via a princípio, já to pensando até em alterar meu DAO para utilizar JDBC ao invés de hibernate... sinceramente não sei o que fazer.
Obrigado gente!
|
Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
Terra de Areia - RS |
|
|
 |
|
|