Screencast - Hibernate e Concorrência Otimista na Web com VRaptor
Por Fabio Kung em 04/03/08É com prazer, depois de tanto tempo, que anuncio o segundo screencast da Caelum.
Assim como o screencast anterior (Primeiros Passos para a JPA), o segundo screencast da Caelum vem em dois sabores. Flash vídeo (.flv), que é a mesma tecnologia usada pelo YouTube e pelo Google Video e pode ser assistido pelo navegador. O outro formato disponível é o famoso AVI (DivX), suportado pela grande maioria dos players.
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!
Hibernate e Concorrência Otimista na Web com VRaptor - duração: 48 min
Assista pelo Navegador: Flash Video (.flv): 52 MB, 800×600
Faça o download: AVI, codificação DivX (.avi): 70,1 MB, 800×600
Código Fonte: Código Fonte produzido durante o Screencast. Você vai precisar baixar as dependências (jars) do projeto separadamente. Por favor, leia o arquivo README.txt.
Olá, fui reproduzir o screecast aqui e não está saindo o video, só o som.
Tem como disponibilizar o codec?
Abraços
Comment by Cairo Noleto — March 4, 2008 @ 7:53 pm
Você tentou a versão DivX ou Flash?
Acredito que qualquer codec DivX sirva. A versão Flash funciona para você?
Comment by Fabio Kung — March 4, 2008 @ 8:17 pm
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.
Comment by Matheus — March 5, 2008 @ 10:59 am
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.
Comment by Fabio Kung — March 5, 2008 @ 11:16 am
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.
Comment by Matheus — March 5, 2008 @ 11:23 am
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.
Comment by Fabio Kung — March 5, 2008 @ 12:25 pm
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?”.
Comment by Paulo Silveira — March 5, 2008 @ 12:26 pm
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?
Comment by Alberto Souza — March 8, 2008 @ 7:04 pm
[...] a leitura do último post, que na verdade é um screencast sobre Hibernate e Concorrência Otimista na Web com [...]
Pingback by Rafael Carneiro » Blog Archive » Recomendação de leitura — March 9, 2008 @ 1:43 pm
Sim Alberto. Se o próprio Cachorro soubesse se persistir ele seria um ActiveRecord.
Comment by Fabio Kung — March 12, 2008 @ 8:48 pm
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í.
Comment by Fernando Boaglio — March 13, 2008 @ 3:00 am
Muito bom mesmo!!!!!
Foi de grande valia pra mim,
Com sugestão de outro screencast: spring
Comment by Wagner — March 27, 2008 @ 3:45 pm
Parabéns pelo screencast. Excelente!! Assim como os cusros que fiz aí.
Comment by Gabriel Ribeiro — April 17, 2008 @ 8:12 pm
Legal, muito didático e passo a passo. parabéns!
Comment by David Buarque — April 22, 2008 @ 12:22 pm
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!
Comment by Felipe Zanardo Affonso — July 25, 2008 @ 5:19 pm