Screencast – Hibernate e Concorrência Otimista na Web com VRaptor
Postado em 04. mar, 2008 por Fabio Kung em Java
É com prazer, depois de tanto tempo, que anuncio o segundo screencast da Caelum.
O vídeo trata de um dos recursos pouco explorados no Hibernate: Controle de Concorrência Otimista, para lidar com problemas de edição simultânea (concorrência) nos registros. O fato curioso é que tenho observado em diversos projetos a preferência por Locks Pessimistas, que em grande parte dos casos não são a melhor escolha. Da própria documentação do Hibernate:
The only approach that is consistent with high concurrency and high scalability is optimistic concurrency control with versioning.
(…)
It is not intended that users spend much time worring about locking strategies. Its usually enough to specify an isolation level for the JDBC connections and then simply let the database do all the work.
Como podemos nos beneficiar do controle de concorrência otimista (também conhecido como lock otimista)? Para explorar o assunto, durante o screencast vamos enriquecendo uma aplicação Web existente, adicionando funcionalidades de edição simples de registros e resolvendo o problema de edição simultânea.
A aplicação Web utilizada usa e abusa do VRaptor como controlador MVC e várias dicas sobre o framework são abordadas durante o vídeo. Porém, a mensagem vale para qualquer aplicação Web. Mesmo as que não usam VRaptor.
Como sempre, o screencast mostra apenas uma das alternativas para solução do problema. Fica como lição de casa, testar outras possibildades:
1) Para não fazer o controle transacional dentro do Dao e forçar a checagem de versão (version check), no lugar do transaction.commit() poderia ter sido usado o session.lock(objeto, LockMode.READ). O método lock serve principalmente para a abordagem pessimista, porém LockMode.READ serve justamente para forçar a checagem de versão no caso otimista.
2) No lugar de tirar a entidade do cache de primeiro nível com session.evict(entidade) e consultá-la novamente para ter a versão mais nova do banco, bastaria usar o método session.refresh(entidade) que atualiza a instancia, passando direto pelos caches.
Não deixe de colocar o seu comentário com outras alternativas!
Fabio Kung
16 Respostas para “Screencast – Hibernate e Concorrência Otimista na Web com VRaptor”
Trackbacks/Pingbacks
-
-
março 9, 2008
[...] a leitura do último post, que na verdade é um screencast sobre Hibernate e Concorrência Otimista na Web com [...]
ASSINE NOSSO RSS




Cairo Noleto
04. mar, 2008
Olá, fui reproduzir o screecast aqui e não está saindo o video, só o som.
Tem como disponibilizar o codec?
Abraços
Fabio Kung
04. mar, 2008
Você tentou a versão DivX ou Flash?
Acredito que qualquer codec DivX sirva. A versão Flash funciona para você?
Matheus
05. mar, 2008
Exelente tutorial mas tenho fiquei com uma dúvida um pouco fora do assunto principal, já foi discutido muito no GUJ a questão de usar lógica separada das propriedades como você fez. Você fez assim por não concordar ou foi só pra ilustrar?
Até mais.
Fabio Kung
05. mar, 2008
Olá Matheus,
Não entendi a sua dúvida. Se estiver falando de separar lógica de negócios de dados, eu não faço isso.
Neste screencast não teve nenhuma lógica de negócios, por isso a entidade ficou parecida com um DTO/modelo anêmico.
Matheus
05. mar, 2008
Não quero fugir muito do tema mas minha dúvida era exatamente o modelo anêmico, nesse caso a classe CachorroLogic não ficaria junto com a classe Cachorro?
Até mais.
Fabio Kung
05. mar, 2008
Na verdade, a CachorroLogic fica mais como uma fachada para o seu domínio. Seria o que se chama de “Service Layer” no DDD.
Se tivesse alguma lógica de negócios, ela estaria no domínio, não na CachorroLogic. Ela só serve para “disparar/estimular” o domínio.
Paulo Silveira
05. mar, 2008
Matheus, mas nã há lógica de negócios, apenas de infraestrutura (no caso persistência). Se o cachorro tivesse de mostrar suas vacinas desde determinado ano, ai sim o cachorro teria um getVacinasDesde(int ano). Esse nome Logic da classe do VRaptor esta para um Service do DDD:
“Service: When an operation does not conceptually belong to any object. Following the natural contours of the problem, you can implement these operations in services.”
Gravar um Cachorro é um serviço. Não faz parte de um Cachorro saber se “cadastrar”. Faz parte de um cachorro saber responder a pergunta “ei, quais vacinas voce tomou desde 2005?”.
Alberto Souza
08. mar, 2008
Usando o Active Record o cachorro não saberia se cadastrar? Acho legal essa possibilidade delegando para um Repositorio ou coisa parecida. Está errado o que pensei?
Fabio Kung
12. mar, 2008
Sim Alberto. Se o próprio Cachorro soubesse se persistir ele seria um ActiveRecord.
Fernando Boaglio
13. mar, 2008
Muito bom o screencast, mostrou de forma bem simples uma das maneiras de se evitar os famosos “lost updates” que existem até hoje por aí.
Wagner
27. mar, 2008
Muito bom mesmo!!!!!
Foi de grande valia pra mim,
Com sugestão de outro screencast: spring
Gabriel Ribeiro
17. abr, 2008
Parabéns pelo screencast. Excelente!! Assim como os cusros que fiz aí.
David Buarque
22. abr, 2008
Legal, muito didático e passo a passo. parabéns!
Felipe Zanardo Affonso
25. jul, 2008
Cara, muito bom esse screencast.
Eu vi que na empresa que eu trabalho o pessoal criou esses atributos version nas classes, mas eu não entendia a “macumba” que ele fazia por dentro pra evitar a edição.
Muito didático, parabéns.
E com o perdão do trocadilho, sua IDE é muito inteliJente!
Wolmir
01. mar, 2010
Opa!
Tudo bele!
Cara eu to trabalhando em um projeto demo em vraptor para estudo.
Atualmente uso jsf mas estou muito interessado em vRaptor pela simplicidade e eficiencia do mesmo, usando juntamente com jquery pode ser feito maravilhas de aplicações que conquistão em usabilidade, eficiencia, beleza e segurança.
Em breve postarei no meu blog um tutorial passo a passo sobre o vraptor 3 o endereço é:
http://wolmirgarbin.wordpress.com/
Espero que gostem.
A medida que eu for desenvolvendo irei postando será um sisteminha bem simples e bem explicativo.
Abraços!