<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; riojug</title>
	<atom:link href="http://blog.caelum.com.br/tag/riojug/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Os 7 hábitos dos desenvolvedores Hibernate e JPA altamente eficazes</title>
		<link>http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/</link>
		<comments>http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 09:26:02 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[LazyInitializationException]]></category>
		<category><![CDATA[persistencia]]></category>
		<category><![CDATA[rio]]></category>
		<category><![CDATA[riojug]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/</guid>
		<description><![CDATA[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 <a href="http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/#more-182'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2012/01/hibernate-logo.png" width="240" />
		</p><p>Essa última semana tive a oportunidade de <a href="http://www.riojug.org/">palestrar no RioJUG sobre JPA e Hibernate</a>, onde fui muito bem recebido pelo <a href="http://gc.blog.br/">Guilherme Chapiewski</a> e <a href="http://webtier.blogspot.com/">Magno Cavalcante</a>. 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 <a href="http://vp.blog.br/">Vitor Pellegrino</a>, Anselmo Alves, Wesley Silva, Alexandre Gazola, <a href="http://programandosemcafeina.blogspot.com/">Tiago Motta</a>, entre outros. Também vi o Ettore Luglio e o Daniel Passos.</p>
<p><center><br />
<a href="http://www.flickr.com/photos/silveira/2221130320/" title="DSC01736 by Paulo Silveira, on Flickr"><img src="http://farm3.static.flickr.com/2056/2221130320_7aaeaf522f_m.jpg" width="240" height="135" alt="DSC01736" /></a> <a href="http://www.flickr.com/photos/silveira/2221128832/" title="DSC01709 by Paulo Silveira, on Flickr"><img src="http://farm3.static.flickr.com/2082/2221128832_086cb7d832_m.jpg" width="240" height="135" alt="DSC01709" /></a><br />
<a href="http://www.flickr.com/photos/silveira/2221128066/" title="DSC01691 by Paulo Silveira, on Flickr"><img src="http://farm3.static.flickr.com/2037/2221128066_083d78e208_m.jpg" width="240" height="135" alt="DSC01691" /></a> <a href="http://www.flickr.com/photos/silveira/2221127324/" title="DSC01750 by Paulo Silveira, on Flickr"><img src="http://farm3.static.flickr.com/2039/2221127324_600dbcd1e8_m.jpg" width="240" height="135" alt="DSC01750" /></a><br />
</center></p>
<p>Infelizmente durante a palestra não tive tempo de mostrar muitos recursos avançados e boas práticas do Hibernate, então vou usar este espaço para tal.</p>
<p>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 <em>&#8220;O problema é o [Hibernate|Struts|JSP, insira sua tecnologia aqui...], que gera uma quantidade excessiva de [queries|objetos|scriptlets|...] durante [lazy loading|requisições|...]&#8220;</em>. 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 não se aprofundando e desconhecem esses detalhes que podem ser vitais no uso de determinadas tecnologias.</p>
<p>Com o Hibernate não é diferente. É muito comum as pessoas culparem o Hibernate pela queda do banco de dados, performance das queries, número de objetos em memória, <code>LazyInitializationException</code>, e outros inúmeros problemas os quais em sua maioria poderiam ter sido evitados com a utilização de alguns recursos, boas práticas e bons hábitos no uso desse framework.</p>
<p>Sem mais demora, <strong>os 7 hábitos:</strong></p>
<p><strong>Connection Pool</strong> &#8211; Usar o pool de conexões embutido com o Hibernate é um erro comum, e a própria documentação diz que você não deve usa-lo em produção! Pode acontecer até connections leak!<br />
A Caelum teve ótimas experiências com o <a href="http://www.mchange.com/projects/c3p0/index.html">C3P0</a>, e é muito fácil <a href="http://www.hibernate.org/214.html">configurá-lo como Provider para o Hibernate</a>.</p>
<p><strong>Second Level Cache</strong> &#8211; Todos já passamos por situações em que precisamos criar caches para as linhas de banco de dados mais acessadas. Aqui temos diversos problemas: sincronismo, gasto de memória, memory leak, tamanho do cache, política de prioridade da fila (LFU, LRU, FIFO, etc), tempo de expiração e modos de invalidar o cache. Escrever um cache eficiente e seguro é um grande trabalho, imagine ainda dar suporte a um cache distribuído e que possa se aproveitar do disco rígido para não gastar tanta memória? Esse é o papel do <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html">second level cache</a>. Você pode usá-lo com diversos providers, sendo o <a href="http://ehcache.sourceforge.net/">EhCache</a> um dos mais conhecidos.</p>
<p><strong>Query Cache</strong> &#8211; Um recurso fantástico do Hibernate. No caso de você ter queries que são executadas inúmeras vezes, você pode pedir para o Hibernate fazer o cache do resultado desta query. O interessante é que ele não 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 através 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. </p>
<p><strong>Controle do Lazy</strong> &#8211; 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, através de um <a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&#038;f=78&#038;t=002559">eager fetch</a>.</p>
<p><strong>Stateless Session</strong> &#8211; 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 <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html">bulk operation</a> é o suficiente, mas se quisermos manter a Orientação a Objetos, devemos tomar cuidado com a grande quantidade de objetos que ficarão armazenados no first level cache. A <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession">StatelessSession</a> resolve esse problema: simplesmente não há first level cache e nenhum objeto se comportará como managed, tendo praticamente o mesmo efeito que chamar <code>entityManager.clear()</code> a cada operação.</p>
<p><strong>Open Session in View</strong> &#8211; 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 sessão esteja aberta no momento da renderização da View, caso contrário teremos uma <code>LazyInitializaionException</code> ou algum código macarrônico para carregar relacionamentos que nem sempre precisamos. Para isso devemos manter a session aberta através de um filtro, interceptador ou algum outro mecanismo. Isso resulta no pattern <a href="http://community.jboss.org/wiki/OpenSessioninView">Open Session in View</a> e também se aplica ao <code>EntityManager</code>.<br />
O mesmo efeito pode ser obtido através de inversão de controle e injeção de dependências através da anotação <code>@PersistenceContext</code>, que é tratada por containers EJB3 e também por muitos frameworks web, como o Spring. O EJB3 ainda possui o conceito de um contexto de persistência extendido, quem é interessante em casos de conversações longas: o <code>EntityManager</code> usado será o mesmo enquanto aquele stateful session bean não for removido.</p>
<p><strong>Evitando número de queries excessivas (n+1)</strong> &#8211; Se uma NotaFiscal possui muitos <code>Item</code>s, e essa coleção é lazy, gastaremos duas queries para buscar a <code>NotaFiscal</code> e seus respectivos Itens. Mas se temos uma lista de <code>NotaFiscal</code> resultante de uma query, para cada <code>NotaFiscal</code> teremos uma nova query executada para todo <code>getItems</code> invocados. <strong>1</strong> query para listar <code>NotaFiscal</code>, <strong>N</strong> queries para pegar os relacionamentos: é o problema das <strong>n+1 queries</strong>. Você deve usar as configurações de <code>batch-size</code> e <code>fetch-size</code> para pedir ao Hibernate carregar as entidades/relacionamentos em blocos em vez de um em um. Você também pode utilizar o second level cache nesses relacionamentos,  diminuindo consideravelmente o número de queries disparada.</p>
<p>Essas são apenas alguns dos hábitos, poderíamos ainda falar sobre o bom tratamento de exceções, o cuidado ao fechar todos os recursos abertos pelo Hibernate, o uso de queries nativas, o mapeamento de queries nativas para entidades através do <code>ResultTransformer</code>, filtros de coleções, dynamic insert e update, a criação do seu próprio tipo de persistência, e muitos outros. Conhecer bem o <a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html">capítulo de performance do Hibernate</a> é fundamental além de um bom começo.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
	</channel>
</rss>

