

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Guia de guerra para tunning de mapeamento do Hibernate</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Thu, 01 Dec 2011 01:51:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: kumpera</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-518</link>
		<dc:creator>kumpera</dc:creator>
		<pubDate>Thu, 05 Oct 2006 04:30:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-518</guid>
		<description>Paulo, eu uso as estatísticas do hibernate, mas somente lendo via logSummary() no log. Valeu pela dica, vou colocar para gravar uma versão muito mais detalhada. Tem três utilidades fazer da forma que eu fiz via log, primeiro que é legal para os bitolados em shell, segundo que logando o ID da thread, fica facil gerar corelação entre código e queries, assim como a seqüência de eventos, por último tem a vantagem de ser facil funilar isso no analizador de planos do RDBMS e apitar para todos full table scan.

Diego, eu uso da seguinte forma:

&lt;code&gt;
Pessoa p = session.load(Pessoa.class, pk);
....
for(Cidade c : p.getCidades())
  ...
&lt;/code&gt;

Nas poucas queries uso sim join e join fetch. A questão é que preciso manipular muito as colections, e quase sempre uso todos os objetos relacionados. 

Sei que estou falando de um caso específico, mas em linhas gerais acho muito ruim ficar programando da forma que você mostrou, escrevendo HQL para coisas simples como carregar um objeto por uma chave ou mesmo navegar pelo grafo de objetos.</description>
		<content:encoded><![CDATA[<p>Paulo, eu uso as estatísticas do hibernate, mas somente lendo via logSummary() no log. Valeu pela dica, vou colocar para gravar uma versão muito mais detalhada. Tem três utilidades fazer da forma que eu fiz via log, primeiro que é legal para os bitolados em shell, segundo que logando o ID da thread, fica facil gerar corelação entre código e queries, assim como a seqüência de eventos, por último tem a vantagem de ser facil funilar isso no analizador de planos do RDBMS e apitar para todos full table scan.</p>
<p>Diego, eu uso da seguinte forma:</p>
<p><code><br />
Pessoa p = session.load(Pessoa.class, pk);<br />
....<br />
for(Cidade c : p.getCidades())<br />
  ...<br />
</code></p>
<p>Nas poucas queries uso sim join e join fetch. A questão é que preciso manipular muito as colections, e quase sempre uso todos os objetos relacionados. </p>
<p>Sei que estou falando de um caso específico, mas em linhas gerais acho muito ruim ficar programando da forma que você mostrou, escrevendo HQL para coisas simples como carregar um objeto por uma chave ou mesmo navegar pelo grafo de objetos.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Diego Pires Plentz</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-515</link>
		<dc:creator>Diego Pires Plentz</dc:creator>
		<pubDate>Thu, 05 Oct 2006 02:34:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-515</guid>
		<description>Ah, caso não saiba, o getHibernateTemplate() é um método oferecido pelo &lt;a href=&quot;http://static.springframework.org/spring/docs/current/reference/orm.html#d0e14683&quot; rel=&quot;nofollow&quot;&gt;suporte do Spring ao Hibernate&lt;/a&gt;.</description>
		<content:encoded><![CDATA[<p>Ah, caso não saiba, o getHibernateTemplate() é um método oferecido pelo <a href="http://static.springframework.org/spring/docs/current/reference/orm.html#d0e14683" rel="nofollow">suporte do Spring ao Hibernate</a>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Diego Pires Plentz</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-514</link>
		<dc:creator>Diego Pires Plentz</dc:creator>
		<pubDate>Thu, 05 Oct 2006 02:28:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-514</guid>
		<description>Quando você diz lookups por primary-key e navegação pelas collections, seria algo tipo isso?

&lt;code&gt;List pessoas = getHibernateTemplate().find(&quot;from Pessoa p join fetch p.cidade where p.id = ? &quot;, pkPessoa);
Cidade cidade = pessoas.get(0).getCidade();&lt;/code&gt;

Bom, se era isso que você estava querendo fazer, mas não conhecia o join fetch, welcome :)</description>
		<content:encoded><![CDATA[<p>Quando você diz lookups por primary-key e navegação pelas collections, seria algo tipo isso?</p>
<p><code>List pessoas = getHibernateTemplate().find("from Pessoa p join fetch p.cidade where p.id = ? ", pkPessoa);<br />
Cidade cidade = pessoas.get(0).getCidade();</code></p>
<p>Bom, se era isso que você estava querendo fazer, mas não conhecia o join fetch, welcome :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-513</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Thu, 05 Oct 2006 00:44:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-513</guid>
		<description>excelente post louds!

para fazer aquele count que voce usou magica de shell script, voce pode utilizar a parte de Hibernate Statistics que é BEM completa, e ele loga muito mais que o número de vezes de cada query executada: pega também tempos máximos, mínimos e médios, row count, etc!</description>
		<content:encoded><![CDATA[<p>excelente post louds!</p>
<p>para fazer aquele count que voce usou magica de shell script, voce pode utilizar a parte de Hibernate Statistics que é BEM completa, e ele loga muito mais que o número de vezes de cada query executada: pega também tempos máximos, mínimos e médios, row count, etc!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kumpera</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-512</link>
		<dc:creator>kumpera</dc:creator>
		<pubDate>Wed, 04 Oct 2006 21:59:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-512</guid>
		<description>Diego, quanto a aplicação utiliza predominantemente queries, concordo com você, coloque a estratégia de fetching a query.

No meu caso a aplicação fazia lookups por primary-key e navegação pela collections. Ou seja, basicamente nada de HQL envolvido. Nesta situação eu teria que introduzí-las artificialmente, ou então utilizar os filtros de colections.

Ou isso, ou eu tou perdendo alguma coisa sobre como utilizar o hibernate.</description>
		<content:encoded><![CDATA[<p>Diego, quanto a aplicação utiliza predominantemente queries, concordo com você, coloque a estratégia de fetching a query.</p>
<p>No meu caso a aplicação fazia lookups por primary-key e navegação pela collections. Ou seja, basicamente nada de HQL envolvido. Nesta situação eu teria que introduzí-las artificialmente, ou então utilizar os filtros de colections.</p>
<p>Ou isso, ou eu tou perdendo alguma coisa sobre como utilizar o hibernate.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Diego Pires Plentz</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-511</link>
		<dc:creator>Diego Pires Plentz</dc:creator>
		<pubDate>Wed, 04 Oct 2006 21:22:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-511</guid>
		<description>Entendi seu ponto Rodrigo, mas o que estou dizendo é que na minha opinião uma estratégia de EAGER loading nunca deveria ser usada no mapeamento (focando no quesito performance).
O mais coerente, na minha opinião, é setar no próprio HQL (ou seja lá a forma que você está usando), que o Hibernate deve carregar essas ou aquelas entidades, pois assim você só as carrega quando realmente vai usá-las.</description>
		<content:encoded><![CDATA[<p>Entendi seu ponto Rodrigo, mas o que estou dizendo é que na minha opinião uma estratégia de EAGER loading nunca deveria ser usada no mapeamento (focando no quesito performance).<br />
O mais coerente, na minha opinião, é setar no próprio HQL (ou seja lá a forma que você está usando), que o Hibernate deve carregar essas ou aquelas entidades, pois assim você só as carrega quando realmente vai usá-las.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kumpera</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-509</link>
		<dc:creator>kumpera</dc:creator>
		<pubDate>Wed, 04 Oct 2006 13:53:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-509</guid>
		<description>Eager loading ajuda em vários cenários. &lt;br/&gt;

O ponto é saber quanto está ajudando e quanto está atrapalhando. O Rick levanta um ponto importante, com Hibernate você deve evitar ao máximo carregar objetos inuteis. &lt;br/&gt;

Dito isso, o ideal é conseguir configurar o Hibernate para que ele recupere todos os objetos necessários com o menor esforço possivel por parte do teu RDBMS. &lt;br/&gt;

Isso pode significar minimizar o número de queries executadas, no meu caso mais recente, por exemplo, o log de queries acusava que  em 92,5% dos casos que uma entidade era carregada, uma das collections dela também era. Logo colocá-la como eager-loaded faz sentido porque diminiu pela metade o número de queries executadas, apenar do outer join extra. 

O grande ponto é saber que é necessário fazer benchmarking de várias configurações diferentes e ajustar para o caso comum. Eu tive que desligar batch-fetching de algumas collections para reduzir o número de entidades que eram recuperadas, enquanto eu coloquei um valor super alto para outras. 

É importante analisar as estatísticas do hibernate, pois aí está a parte que ninguém comenta sobre como decidir o que fazer e não fazer na hora de otimizar o mapeamento.</description>
		<content:encoded><![CDATA[<p>Eager loading ajuda em vários cenários. </p>
<p>O ponto é saber quanto está ajudando e quanto está atrapalhando. O Rick levanta um ponto importante, com Hibernate você deve evitar ao máximo carregar objetos inuteis. </p>
<p>Dito isso, o ideal é conseguir configurar o Hibernate para que ele recupere todos os objetos necessários com o menor esforço possivel por parte do teu RDBMS. </p>
<p>Isso pode significar minimizar o número de queries executadas, no meu caso mais recente, por exemplo, o log de queries acusava que  em 92,5% dos casos que uma entidade era carregada, uma das collections dela também era. Logo colocá-la como eager-loaded faz sentido porque diminiu pela metade o número de queries executadas, apenar do outer join extra. </p>
<p>O grande ponto é saber que é necessário fazer benchmarking de várias configurações diferentes e ajustar para o caso comum. Eu tive que desligar batch-fetching de algumas collections para reduzir o número de entidades que eram recuperadas, enquanto eu coloquei um valor super alto para outras. </p>
<p>É importante analisar as estatísticas do hibernate, pois aí está a parte que ninguém comenta sobre como decidir o que fazer e não fazer na hora de otimizar o mapeamento.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Diego Pires Plentz</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-507</link>
		<dc:creator>Diego Pires Plentz</dc:creator>
		<pubDate>Wed, 04 Oct 2006 03:12:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-507</guid>
		<description>Minha dúvida ficou por conta da estratégia de eager-loading, pois não vejo caso em que ela ajudaria na performance.</description>
		<content:encoded><![CDATA[<p>Minha dúvida ficou por conta da estratégia de eager-loading, pois não vejo caso em que ela ajudaria na performance.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Diego Pires Plentz</title>
		<link>http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/comment-page-1/#comment-506</link>
		<dc:creator>Diego Pires Plentz</dc:creator>
		<pubDate>Wed, 04 Oct 2006 03:08:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/09/29/guia-de-guerra-para-tunning-de-mapeamento-do-hibernate/#comment-506</guid>
		<description>Complementando o artigo, o Rick &lt;a href=&quot;http://jroller.com/page/RickHigh?entry=hibernate_performance_tunning_for_high&quot; rel=&quot;nofollow&quot;&gt; ez um post interessante&lt;/a&gt; sobre o mesmo assunto.</description>
		<content:encoded><![CDATA[<p>Complementando o artigo, o Rick <a href="http://jroller.com/page/RickHigh?entry=hibernate_performance_tunning_for_high" rel="nofollow"> ez um post interessante</a> sobre o mesmo assunto.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

