Manter objeto em lock com o hibernate  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
yuripodho
JavaTeenager

Membro desde: 20/08/2009 08:24:13
Mensagens: 160
Offline

Pessoal, quero manter um objeto em lock com o hibernate de modo que uma outra aplicação que utiliza a mesma base de dados não consiga utilizar ele enquanto estou na minha aplicação.
Ok, utilizo o comando meuDAO.get(id,true) e fica em lock. O problema é quando termina o meu método o objeto perde o estado e não sei como manter em lock depois de terminar o método.

cada um, cada um. Mas tem cada um...
Hebertbc
JavaChild
[Avatar]

Membro desde: 07/11/2008 20:27:15
Mensagens: 113
Localização: Campo Grande / MS
Offline

Não seria pq vc esta fechando a sessão....

C'est la vie monsieur excentrique...
peerless
GUJ Master
[Avatar]

Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

follow me
pitacos

"The most problems that teams face are about communication, and all the others are too." - Dan North





[MSN]
yuripodho
JavaTeenager

Membro desde: 20/08/2009 08:24:13
Mensagens: 160
Offline

Não estou fechando a sessão no código, mas quando termina o método o VRaptor já dá todos os commits e tal. E aí perde o estado do meu objeto.
Estou com o livro do hibernate aqui do meu lado, mas até agora não saí do lugar

cada um, cada um. Mas tem cada um...
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

Entao.. quando acontece esses comits e tal.. a sessao é fechada...

Acho que vai ser meio complicado manter a sessao.. e ainda o lock abertos por tanto tempo.. parece que vc quer retornar o html pro cara.. e só depois quando o usuario resolver a vida dele.. é que que vai fechar a sessao e lock.. se for isso mesmo.. sua aplicacao vai ter sérios problemas.. pense em outra solucao

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
yuripodho
JavaTeenager

Membro desde: 20/08/2009 08:24:13
Mensagens: 160
Offline

Tem alguma sugestão? É um webservice que enquanto está rodando, uma outra aplicação que utiliza a mesma base não pode usar o registro

cada um, cada um. Mas tem cada um...
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

A situacao é assim:

- Cliente faz chamada no web service

- Servidor pega o registro e dá lock

- Servidor faz o processamento

- Servidor termina o processamento e libera o lock

- Cliente recebe os dados..

A sequencia é essa?

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
yuripodho
JavaTeenager

Membro desde: 20/08/2009 08:24:13
Mensagens: 160
Offline

Analisando aqui o problema vai ser um pouco maior.

- Cliente faz a chamada no webservice.
- Servidor pega o registro e dá lock e retorna xml para o cliente com os dados.
- Cliente altera dados na aplicação e faz outra chamada no webservice para salvar os dados alterados.
- Salva os dados e libera o lock

Essa é a situação real que acontece

cada um, cada um. Mas tem cada um...
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

É... entao é o jeito mais complicado mesmo...

Voce poderia pegar o lock.. e alterar o valor de uma coluna chama emuso por exemplo.. e colocar valor true nela

Quanto o cliente for salvar e terminar com o registro coloca valor false..

Mas nao to achando essa solucao muito interessante de qualquer forma nao...

Mesmo porque.. se o cliente nao retornar com a chamada aquele registro vai ficar com true pra sempre.. se vc nao fizer outro mecanismo de timeout ...

Nao daria pra na tentativa de salvar os dados.. caso outra pessoa tivesse alterado.. soltar uma exceção nao?

This message was edited 1 time. Last update was at 12/03/2010 11:00:56


Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
rogelgarcia
GUJ Master
[Avatar]

Membro desde: 21/06/2007 23:27:21
Mensagens: 1850
Offline

De qualquer jeito.. funcionalmente nao to achando muito interessante essa funcionalidade..

Imagina..

Um cliente pegou o registro

Um segundo cliente tenta pegar o registro mas nao consegue porque ele está em uso por outra pessoa

O segundo cliente vai ter que esperar a boa vontade do primeiro para poder alterar o registro...

O segundo acho que vai ficar puto..

Num fica uma funcionalidade boa.. entende?

Rógel Garcia, criador do framework NEXT

http://www.nextframework.org
Java Lover
Debugger
[Avatar]

Membro desde: 24/02/2010 16:27:05
Mensagens: 62
Localização: Belo Horizonte / MG
Offline

yuripodho wrote:Analisando aqui o problema vai ser um pouco maior.

- Cliente faz a chamada no webservice.
- Servidor pega o registro e dá lock e retorna xml para o cliente com os dados.
- Cliente altera dados na aplicação e faz outra chamada no webservice para salvar os dados alterados.
- Salva os dados e libera o lock

Essa é a situação real que acontece

E se no momento que o cliente altera os dados na aplicação...
  • Ele morreu de infarto
  • Caiu a conexão da internet
  • Deu apagão na luz
  • Resolveu sair pra almoçar
  • Foi dar uma xeretada no site do GUJ

  • Ninguém mais tem acesso ao banco ...
    DEADLOCK neles


    Dúvida solucionada ?
  • Acrescente ao nome do tópico [RESOLVIDO].
  • Explique a falha e como resolveu.
  • Agradeça a dica.
  • yuripodho
    JavaTeenager

    Membro desde: 20/08/2009 08:24:13
    Mensagens: 160
    Offline

    Java Lover wrote:
    yuripodho wrote:Analisando aqui o problema vai ser um pouco maior.

    - Cliente faz a chamada no webservice.
    - Servidor pega o registro e dá lock e retorna xml para o cliente com os dados.
    - Cliente altera dados na aplicação e faz outra chamada no webservice para salvar os dados alterados.
    - Salva os dados e libera o lock

    Essa é a situação real que acontece

    E se no momento que o cliente altera os dados na aplicação...
  • Ele morreu de infarto
  • Caiu a conexão da internet
  • Deu apagão na luz
  • Resolveu sair pra almoçar
  • Foi dar uma xeretada no site do GUJ

  • Ninguém mais tem acesso ao banco ...
    DEADLOCK neles


    Concordo...

    Porém a solicitação foi essa mesma, o que estava acontecendo era de vários usuários estarem alterando o mesmo registro ao mesmo tempo. Então se um usuário estiver alterando deve lançar uma exception para os outros saberem que já está sendo utilizado.

    cada um, cada um. Mas tem cada um...
    mario.fts
    GUJ Ranger
    [Avatar]

    Membro desde: 14/05/2008 09:41:06
    Mensagens: 817
    Localização: São Paulo - ZL
    Offline

    Complexo. Se vc colocar o status como boolean, e o cara desistir da edição, vc fica com o registro travado no banco.

    O que vc pode fazer é quando um usuário solicita edição do registro, vc verificar se há outro usuário editando esse mesmo registro, e retornar ele somente leitura.

    Ao invés de usar o boleano para travar o registro, usava um date, e configurava um timeout , sei lá, 5 mim para edição, depois diso já era, pode editar de novo.
    Se o primeiro usuário passar do tempo de edição, (demorar 6 minutos por exemplo) invalida a operação com um erro de timeout. ou melhor ainda, checa se alguém tentou editar o registro ao mesmo tempo, se sim dá timeout, se não confirma a alteração.

    Mas é só uma idéia, acho que deve haver jeitos melhores pra solucionar isso.



    Mário Amaral Gonçalves

    "Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
    [Email]
    Java Lover
    Debugger
    [Avatar]

    Membro desde: 24/02/2010 16:27:05
    Mensagens: 62
    Localização: Belo Horizonte / MG
    Offline

    Eu estava escrevendo uma sugestão pra vc...
    Mas fiquei na dúvida...
  • A base de dados é acessada por vários aplicativos ?
  • Vários aplicativos acessam seu aplicativo que acessa a base de dados ?
  • Usuários acessam o seu aplicativo que acessa a base de dados ?


  • Dúvida solucionada ?
  • Acrescente ao nome do tópico [RESOLVIDO].
  • Explique a falha e como resolveu.
  • Agradeça a dica.
  • yuripodho
    JavaTeenager

    Membro desde: 20/08/2009 08:24:13
    Mensagens: 160
    Offline

    Sim, são vários aplicativos (em Delphi) utilizando a mesma base. Uma delas consome o meu webservice. As aplicações em Delphi já colocam em lock, ou seja, se um deles está usando o meu webservice não consegue pegar o registro. Agora tem que fazer o contrário, quando acessa pelo webservice, as outras aplicações não podem usar esse registro.

    cada um, cada um. Mas tem cada um...
     
    Índice dos Fóruns » Java Básico
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team