Вы находитесь на странице: 1из 8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

Buscar

Caelum | Newsletter | Apostilas |

Like

11k

Blog Java Rails Agile Web Design Arquitetura Inovao

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes


Postado em 28. jan, 2008 por Paulo Silveira em Java
Curtir Tw eet 7 76 76 pessoas curtiram isso. Seja o primeiro entre seus amigos.

Compartilhar

Essa ltima semana tive a oportunidade de palestrar no RioJUG sobre JPA e Hibernate, onde fui muito bem recebido pelo Guilherme Chapiewski e Magno Cavalcante. Isso ocorreu durante o treinamento de Arquitetura Java que demos para diversos desenvolvedores da Globo.com, e onde tive o prazer de conhecer alguns desenvolvedores e arquitetos, como Vitor Pellegrino, Anselmo Alves, Wesley Silva, Alexandre Gazola, Tiago Motta, entre outros. Tambm vi o Ettore Luglio e o Daniel Passos.

Infelizmente durante a palestra no tive tempo de mostrar muitos recursos avanados e boas prticas do Hibernate, ento vou usar este espao para tal. Precisamos conhecer todo pontencial de qualquer ferramenta, framework ou biblioteca que vamos usar em um projeto. Uma ferramenta boa, sem o devido conhecimento, resulta em projetos atrasados, com problemas de performance e desculpas do tipo O problema o [Hibernate|Struts|JSP, insira sua tecnologia aqui...], que gera uma quantidade excessiva de [queries|objetos|scriptlets|...] durante [lazy loading|requisies|...]. Isso vale em especial para ferramentas mais antigas, como JSP e Struts 1. Hoje em dia ambas possuem recursos poderosos que auxiliam em muito o desenvolvimento, mas alguns desenvolvedores acabam no se aprofundando e desconhecem esses detalhes que podem ser vitais no uso de determinadas tecnologias. Com o Hibernate no diferente. muito comum as pessoas culparem o Hibernate pela queda do banco de dados, performance das queries, nmero de objetos em memria, L a z y I n i t i a l i z a t i o n E x c e p t i o n , e outros inmeros problemas os quais em sua maioria poderiam ter sido evitados com a utilizao de alguns recursos, boas prticas e bons hbitos no uso desse framework. Sem mais demora, os 7 hbitos: Connection Pool Usar o pool de conexes embutido com o Hibernate um erro comum, e a prpria documentao diz que voc no deve usa-lo em produo! Pode acontecer at connections leak! A Caelum teve timas experincias com o C3P0, e muito fcil configur-lo como Provider para o Hibernate. Second Level Cache Todos j passamos por situaes em que precisamos criar caches para as linhas de banco de dados mais acessadas. Aqui temos diversos problemas: sincronismo, gasto de memria, memory leak, tamanho do cache, poltica de prioridade da fila (LFU, LRU, FIFO, etc), tempo de expirao e modos de invalidar o cache. Escrever um cache eficiente e seguro um grande trabalho, imagine ainda dar suporte a um cache distribudo e que possa se aproveitar do disco rgido para no gastar tanta memria? Esse o papel do second level cache. Voc pode us-lo com diversos providers, sendo o EhCache um dos mais conhecidos. Query Cache Um recurso fantstico do Hibernate. No caso de voc ter queries que so executadas inmeras vezes, voc pode pedir para o Hibernate fazer o cache do resultado desta query. O interessante que ele no vai armazenar todos os objetos resultantes, e sim apenas suas primary keys: no momento que ele precisar executar novamente aquela query, ele j tem todos os IDs resultantes, e atravs destes ele consulta o second level cache, sem fazer um nico hit ao banco de dados! Esse cache ser invalidado quando alguma das tabelas envolvidas nesta query for atualizada, ou um determinado tempo passar. Controle do Lazy Algumas pessoas costumam reclamar do lazy loading, dizendo que em alguns casos teria sido melhor ele carregar tudo em uma nica query. Voc sempre pode redefinir o comportamento desses relacionamentos quando fizer uma query, atravs de um eager fetch.

blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter

1/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

Stateless Session Algumas vezes precisamos fazer um processamento em batch de objetos, ou mesmo inserir uma quantidade grande deles na base de dados. Em muitos casos uma bulk operation o suficiente, mas se quisermos manter a Orientao a Objetos, devemos tomar cuidado com a grande quantidade de objetos que ficaro armazenados no first level cache. A StatelessSession resolve esse problema: simplesmente no h first level cache e nenhum objeto se comportar como managed, tendo praticamente o mesmo efeito que chamar e n t i t y M a n a g e r . c l e a r ( )a cada operao. Open Session in View Na arquitetura MVC, muitas vezes renderizamos em nossa view diversas entidades do nosso modelo, e essas podem ter sido carregas pelo Hibernate. Se essas entidades possuem relacionamentos lazy, precisamos que a sesso esteja aberta no momento da renderizao da View, caso contrrio teremos uma L a z y I n i t i a l i z a i o n E x c e p t i o nou algum cdigo macarrnico para carregar relacionamentos que nem sempre precisamos. Para isso devemos manter a session aberta atravs de um filtro, interceptador ou algum outro mecanismo. Isso resulta no pattern Open Session in View e tambm se aplica ao E n t i t y M a n a g e r . O mesmo efeito pode ser obtido atravs de inverso de controle e injeo de dependncias atravs da anotao @ P e r s i s t e n c e C o n t e x t , que tratada por containers EJB3 e tambm por muitos frameworks web, como o Spring. O EJB3 ainda possui o conceito de um contexto de persistncia extendido, quem interessante em casos de conversaes longas: o E n t i t y M a n a g e rusado ser o mesmo enquanto aquele stateful session bean no for removido. Evitando nmero de queries excessivas (n+1) Se uma NotaFiscal possui muitos I t e m s, e essa coleo lazy, gastaremos duas queries para buscar a N o t a F i s c a le seus respectivos Itens. Mas se temos uma lista de N o t a F i s c a lresultante de uma query, para cada N o t a F i s c a lteremos uma nova query executada para todo g e t I t e m sinvocados. 1 query para listar N o t a F i s c a l , N queries para pegar os relacionamentos: o problema das n+1 queries . Voc deve usar as configuraes de b a t c h s i z ee f e t c h s i z epara pedir ao Hibernate carregar as entidades/relacionamentos em blocos em vez de um em um. Voc tambm pode utilizar o second level cache nesses relacionamentos, diminuindo consideravelmente o nmero de queries disparada. Essas so apenas alguns dos hbitos, poderamos ainda falar sobre o bom tratamento de excees, o cuidado ao fechar todos os recursos abertos pelo Hibernate, o uso de queries nativas, o mapeamento de queries nativas para entidades atravs do R e s u l t T r a n s f o r m e r , filtros de colees, dynamic insert e update, a criao do seu prprio tipo de persistncia, e muitos outros. Conhecer bem o captulo de performance do Hibernate fundamental alm de um bom comeo.

Paulo Silveira (Google+)


Mais sobre o autor

Curtir

76 pessoas curtiram isso. Seja o primeiro entre seus amigos. Tw eet 7

Compartilhar

Tags: cache, eventos, fj-25, hibernate, jpa, LazyInitializationException, persistencia, rio, riojug

39 Respostas para Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes

1. Daniel F. Martins
28. jan, 2008

Excelente post!

2. cleuber
28. jan, 2008

S tenho uma dvida, em relao primeira recomendao. No seria melhor usar um pool de conexes provido pelo servidor de aplicao JEE ?

3. Paulo Silveira
28. jan, 2008

Ol Cleuber! Tem razo, sem dvida mais interessante usar o pool/data source que o servidor disponibilizar. Minhas dicas aqui foram focadas no possvel uso stand alone do hibernate+jpa, tanto que no Open Session in View cito a possibilidade do @PersistenceContext no caso de voc se encontrar em um servidor de aplicao. Dentro de um servidor de aplicao Java EE voc ter diversas facilidades e vantagens ao usar a JPA.
blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter 2/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

4. Eduardo Bregaida
28. jan, 2008

Show de bola Paulo =)

5. Tiago Albineli Motta


29. jan, 2008

Muito til, post pra ser guardado nos favoritos.

6. Vitor Pellegrino
30. jan, 2008

Grande Paulo! Assim como foi a palestra, este foi um excelente post. Foi muito bom conhecer a ti e a teu irmo. Um grande abrao para vocs todos a da Caelum. At a prxima!

7. Paulo Vitor
05. fev, 2008

A associao do ttulo do post com o livro Os 7 hbitos das pessoas altamente eficazes foi interessante ahuhua (alis um livro muito bom).. Queria fazer alguns comentrios, que vo ser mais perguntas XD 1 Contexto de persistncia extendido seria a mesma idia da conversaso do webbeans(que se entendi bem, poder ter o controle sobre entidades durante N requisies, podendo-se fazer, por exemplo, um cadastro com 5 telas)? 2 Sobre usar o Query Cache, isso no pode me causar problemas do tipo receber um EntityNotFoundException ao tentar editar um item de uma lista que foi gerada a partir de uma consulta que utiliza cache? 3 Quando eu utilizo transaction-type JTA no persistence.xml, pelo que sei, eu to delegando o controle das transaes ao containermas e caso eu queira tratar uma delas(dar um transaction.begin(), comitar, etc)? existe essa possibilidade? Agradeo a ateno e parabns pelo post, vou procurar ler sobre Stateless Session, eu sequer imaginava que o Hibernate tinha esse recurso..

8. Paulo Silveira
06. fev, 2008

ola Paulo Vitor! Excelente perguntas/observacoes! 1. Isso mesmo! a mesma idia e ela tambm j existia antes no Hibernate, e eles chamavam de Extended Session Pattern for Long Conversations: http://www.hibernate.org/43.html#A5 2. Nao pode causar esse problema no, pois o hibernate invalida aquela entrada do cache quando ha uma modificacao em alguma linha nas tabelas envolvidas naquela query 3. Voce pode usar a anotacao @Resource em um atributo do tipo UserTransaction, que o EJB3 container se encarregara de injetar uma transacao para voce antes da invocacao de metodo, e ai voce faz o controle manual como queira! abracos

blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter

3/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

9. Paulo Vitor
06. fev, 2008

Hum, vou testar o @Resource + UserTransaction! Obrigado pelas explicaes Paulo! Ah, e parabns, o blog t com um contedo bem legal, abrao!

10. Germano Fronza


12. fev, 2008

Post muitssimo bom! Valeu Paulo, este blog o melhor

11. Diego Carrion


17. fev, 2008

Muito bom mesmo o post Paulo. Somente falta colocar um feed por favor

12. Davi
13. mar, 2008

Muito legal o post, Paulo. Uma pergunta: qual tem sido a prtica com relao a JPA e DAOs? Porque tenho visto algumas pessoas defendendo que, com o EntityManager, no necessrio criar DAOs, pois o EntityManager j funcionaria como uma abstrao, e ainda um padro. Qual sua opinio a respeito?

13. Fred
03. nov, 2008

Tenho a mesma duvida do Davi

14. Paulo Silveira


03. nov, 2008

Essa uma discusso que a gente aborda no treinamento de EJB na Caelum. Se voce estiver usando JPA fora do servidor, certamente uma boa pratica encapsular o acesso ao EntityManager por um DAO ou alguma outra classe. Se voce esta usando JPA dentro de um servidor java ee, existem 3 opcoes: - Usar o EntityManager diretamente, sem nenhum outro layer - Criar um session bean, que age como DAO, e injetado em outros beans atraves de @EJB - Criar um DAO que um POJO e no um EJB, da maneira habitual Cada um tem suas vantagens e desvantagens. Nos pessoalmente nao gostamos da 1a opcao, de acessar o EntityManager diretamente sempre, apesar de
blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter 4/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

existirem recursos (como named queries) que possibilitam isso de uma maneira de certa forma organizada.

15. Felipe
20. mai, 2010

Excelente!

16. Cristiano
04. nov, 2010

Bacana! Tive um problema ao executar a insero de grandes quantidades de registros na base de dados. Acredito q a dica sobre Stateless Session ser util!

17. Marcos Hanberas


07. fev, 2011

Dizer que Open Session in View faz parte dos 7 hbitos altamente eficazes no faz sentido. Este um dos maiores anti-patterns j criado, justamente pelo fato de passar desapercebido pela maioria das pessoas. Reveja esta parte, porque muitos programadores que chegam aqui na empresa seguem a risca o que lem no blog da Caelum.

18. Paulo Silveira


07. fev, 2011

@Marcos Hanberas. Nao entendi sua argumentacao do open session in view ser um anti pattern. Por que motivo? Alguma referncia a respeito? Se por causa do excesso de queries lazy, basta ler _um_ paragrafo abaixo e vai ver que tambm falado para tomar cuidado com o excesso de queries e o problema do n+1.

19. Marcos Hanberas


12. fev, 2011

@Paulo Silveira. Paulo, fui avisado pelo estgio que voc respondeu a minha colocao, desculpe no ter respondido antes. A viso do OpenSessionInFilter como antipattern no novidade. Zubin Wadia e Dennis Byrne j alertavam sobre esse antipattern faz tempo. Na prpria comunidade do Hibernate ela no vista com bons olhos. Se isso algo que deve ser evitado, ento, no deveria constar nos 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes. Como todo desenvolvedor que no gosta de reinventar a roda, a explicao desse cara aqui para mim satisfatria, mas faltou casos de uso para ficar mais clara: http://www.guj.com.br/java/231652-alguem-usa-algum-padrao-diferente-de-open-session-in-view-ao-trabalhar-com-jpa Eu estarei off durante duas semanas, mas posso voltar a tocar no assunto sempre quando necessrio. Um abrao

20. Paulo Silveira


12. fev, 2011

@Marcos Acho a explicacao do Flavio muito boa. Realmente o problema do N+1 pode acontecer com o excesso de lazy, que esta relacionado nao exatamente ao uso do open session in view e sim do excesso de lazy. Mas como te falei, nesse mesmo post que escrevi, 1 paragrafo abaixo do OpenSessionInView, eu falo exatamente isso: para tomar cuidado com os lazy e o n+1.
blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter 5/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

Nao encontrei outras referencias a isso a nao ser ao livro do MyFaces que voce citou. E, no JSF, realmente o lazy se complica ainda mais, ja que, em algumas implementacoes, sao disparados muitos dos seus getters, por varias vezes, durante uma requisicao, ativando seus atributos lazys e fazendo N queries. Respondi la no GUJ para o Flavio.

21. Mayko
14. fev, 2011

Parabns pelo post! agora vi que preciso melhorar minha infraestrutura utilizando o Hibernate, j perdi as contas de quantas vezes tive que utilizar o mtodo clear para realizar operaes transacionais, talvez se tivesse lido isto antes j teria pensado em algo melhor. Agora s uma pergunta. Eu costumo utilizar a implementao do SessionFactory para trabalhar com o Hibernate, sei que poderia utilizar o EntityManager mas at onde sei este no possue a API Criteria que um recurso que eu gosto bastante, ento o que eu ganho utilizando o EntityManager? outra coisa: eu utilizo o JPA para realizar o mapeamento mas no utiilizo a unidade de persistncia dele e sim a do hibernate diretamente, isto tem a ver com o que voc falou no primeiro hbito? Obrigado, faz pouco tempo que comeei com o Hibernate, pouco mais de um ano, e quero melhorar muito.. valeu Caelum, valeu Paulo

22. Paulo Silveira


14. fev, 2011

@Mayko Sobre usar o EntityManager/JPA, a maior vantagem vai ser utilizar um padro, e dessa forma no ter de reaprender outra api de ORM se um dia for trocar de vendor. Para alguns isso no motivo suficiente para usar JPA. Sobre o Criteria, na JPA2 ela est presente mas gera mixed feelings por sua tipagem forte e seu StaticMetaModel. Falei um pouco disso aqui: http://blog.caelum.com.br/metaprogramacao-em-java-o-papel-do-apt/ Fico contente que o post tenha ajudado.

23. Danilo Miranda


17. mar, 2011

Ol Paulo, Como fao para identificar num projeto se o programador utilizou Connection Pool ou no? Abrao.

24. Paulo Silveira


17. mar, 2011

@Danilo Basta voce ver como esta a configuracao do hibernate.cfg.xml. La fica definido o uso do c3p0, por exemplo.

25. Danilo Miranda


19. mar, 2011

@Paulo
blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter 6/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

No encontrei este arquivo em meu projeto. Fiz uma pesquisa e disseram que fica aqui: WEB-INF/classes/resources/hibernate.cfg.xml Mas no meu projeto nem tenho esta pasta resources dentro de classes.

26. Paulo Silveira


19. mar, 2011

Ola Danilo Pode ser que seu hibernate esteja funcionando com o estilo antigo de configuracao, que fica em hibernate.properties em vez de hibernate.cfg.xml. Pode estar tambem em outro diretorio, o mais comum seria em WEB-INF/classes em produo, mas pode variar tambm se voc configurar de maneiras diferentes.

27. Fabiano Conrado


03. ago, 2011

Excelente material!

28. ricardo wolosker


10. dez, 2011

possvel fazer relacionamentos de 1:1 forando entidade fraca?

Trackbacks/Pingbacks
1. Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | Blog MasterSoft Sistemas Ltda - fevereiro 20, 2008 [...] Paulo Silveira publicou no blog da Caelum um excelente post sobre Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes. Nele ele chama a ateno para muitas partes que so frequentemente esquecidas pelos [...] 2. No more DAOs | Rafael Ponte - junho 8, 2009 [...] em mente que nossa aplicao (principalmente o domain model) estar mergulhada nas features do framework, como anotaes, contexto de persistncia, lazy loading, dirty checking etc. [...] 3. Enfrentando a LazyInitializationException no Hibernate | blog.caelum.com.br - outubro 13, 2009 [...] quando realmente necessrios. Ao mesmo tempo deve-se tomar cuidado: pode gerar o problema das n+1 queries, e muitas vezes sabemos que tal relacionamento ser to utilizado, que deve ser feito de maneira [...] 4. As dependncias do Hibernate 3.5 | blog.caelum.com.br - abril 14, 2010 [...] muito o desenvolvimento com banco de dados, porm para uma performance e escalabilidade adequada necessrio ficar atento em alguns pontos fundamentais, e tambm simples, para que ele no se torne um gargalo na sua aplicao. Dentro do diretrio [...] 5. Using EclipseLink JPA Weaving CoffeeBreak Point. - dezembro 9, 2010 [...] tudo. Consultas em classes com diversos relacionamentos e/ou com colees estavam gerando queries excessivas, bom e como resolver isso [...] 6. Quando muitos dados passam a atrapalhar: replicao e sharding | blog.caelum.com.br - fevereiro 9, 2011 [...] de performance e escalabilidade, como por exemplo a criao de um ndice para buscas, o uso de caches e de chamadas [...] 7. Caando seus gargalos com o Hibernate Statistics | blog.caelum.com.br - junho 8, 2011 [...] escalabilidade da aplicao. Ser realmente culpa do framework? Prticas simples podem ajudar a enfrentar esses gargalos ao usar o Hibernate, mas como detect-los numa aplicao que j foi mapeada sem muito cuidado? Uma das ferramentas [...] 8. Rao Semanal: JPA & Hibernate Rogrio Arajo - julho 7, 2011 [...] Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente : http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpaaltamente-eficazes/; [...]
blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter 7/8

16/01/13

Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes | blog.caelum.com.br

9. Rao Semanal: JPA & Hibernate : TI & Informtica para Concursos Pblicos - julho 7, 2011 [...] Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente : http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpaaltamente-eficazes/; [...] 10. Iniciando bem no geoprocessamento com VRaptor 3 e Postgis | Carlos Alberto Junior - junho 19, 2012 [...] interceptadores para controlar as transaes. Este modo de controle de transaes o famoso Open Session in View. Alm de transaes, ele tambm cria as sesses com o banco e injeta nas nossas lgicas o [...] 11. Mandando bem no geoprocessamento com VRaptor 3, Maven e Postgis | iMasters - novembro 28, 2012 [...] interceptadores para controlar as transaes. Este modo de controle de transaes o famoso Open Session in View. Alm de transaes, ele tambm cria as sesses com o banco e injeta nas nossas lgicas o [...]

Deixar uma Resposta


Nome (obrigatrio) D i g i t es e u c o m e n t r i o a q u i . . . E-mail (obrigatrio) Site (opcional)

ASSINE NOSSO RSS

Facebook
Caelum - Ensino e Inovao
Curtir 11.606 pessoas curtiram Caelum - Ensino e Inovao.

Destaques
As Novidades do Eclipse Juno Por uma Web mais rpida: 26 tcnicas de otimizao de Sites Use CDI no seu prximo projeto Java Flexibilidade em pginas para dispositivos mveis com media queries Como no aprender Java e Orientao a Objetos: getters e setters Usando o Google Maps e GPS no Android Entenda os MVCs e os frameworks Action e Component Based Pixels, pixels ou pixels? Dicas de Web Mobile com viewport As novidades do Hibernate 4 Os 7 hbitos dos desenvolvedores Hibernate e JPA altamente eficazes

Siga-nos no Twitter
Caelum
@caelum

6341 seguidores
"CSS, Front-end, curso online JSF 2, Java e Retrospectiva 2012 http://t.co/FTaLkOde #newsletter #caelum"
Caelum RSS Newsletter Contato

blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/?utm_source=Caelum&utm_campaign=342320b013-Newsletter

8/8

Вам также может понравиться