<?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; c3p0</title>
	<atom:link href="http://blog.caelum.com.br/tag/c3p0/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>As dependências do Hibernate 3.5 e 3.6</title>
		<link>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/</link>
		<comments>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 22:16:52 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[c3p0]]></category>
		<category><![CDATA[connection pool]]></category>
		<category><![CDATA[dependências]]></category>
		<category><![CDATA[fj-25]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2358</guid>
		<description><![CDATA[O primeiro desafio de um iniciante em Hibernate, antes mesmo de fazer um tutorial prático, como o disponível na apostila FJ-21 da Caelum, é organizar as dependências necessárias. Até o Hibernate 3.3, a maneira a qual ele era distribuído dava trabalho pra quem precisasse usar a JPA: além do zip contendo o hibernate, era necessário <a href="http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/#more-2358'" 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/2010/04/lib-required-dir.png" width="240" />
		</p><p>O primeiro desafio de um iniciante em Hibernate, antes mesmo de fazer um tutorial prático, como o disponível na <a href="http://www.caelum.com.br/curso/fj-21-java-web/">apostila FJ-21 da Caelum</a>, é organizar as dependências necessárias. Até o Hibernate 3.3, a maneira a qual ele era distribuído dava trabalho pra quem precisasse usar a JPA: além do zip contendo o hibernate, era necessário fazer o download de um outro jar contendo a implementação do <code>EntityManager</code> e ainda outro contendo as anotações e interfaces da JPA.</p>
<p>A versão 3.5, como a 3.6, além de trazer uma implementação da JPA2, juntou todos esses pacotes em um só. A documentação está ainda mais completa, assim como a parte explicando o processo de <a href="http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial.html#tutorial-firstapp-setup">setup do seu primeiro projeto</a>. Apesar disso, como se pode ler na documentação, ela é feita assumindo que você esteja usando o maven. Muitos iniciantes em Java ainda tem dificuldades pra encarar o Maven, ou há ainda quem prefira usar o Ant, Ivy ou gerenciar as dependências manualmente. Quais dependências preciso então para rodar uma aplicação com Hibernate 3.5/3.6?</p>
<p><strong>Para facilitar seu trabalho, <a href="http://downloads.caelum.com.br/artigos/dependencias-hibernate-3.5.0.zip">deixamos aqui um zip com todas essas dependências do Hibernate 3.5.0</a>, além de um arquivo de configuração para o Log4J, um hibernate.cfg.xml e jars opcionais</strong>.</p>
<p>Ou então você pode juntar esses jars seguindo o passo a passo:  primeiramente precisa baixar a distribuição 3.5/3.6 a partir da <a href="http://sourceforge.net/projects/hibernate/files/hibernate3/">página de downloads do hibernate no sourceforge</a>. Ao descompactá-la, encontramos os seguintes arquivos e diretórios:</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png" width="480"/></a></center></p>
<p>O <code>hibernate3.jar</code> é um jar contendo as classes fundamentais do Hibernate. Agora, dentro de <code>lib</code>, temos o diretório <code>required</code>, que são dependências que sempre precisaremos utilizar junto com o Hibernate. Todas essas 6 dependências são necessárias:</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/hibernate-dir.png"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/04/lib-required-dir.png" width="480" /></a></center></p>
<p>Dentro de <code>lib</code>, ainda precisamos do jar <code>hibernate-jpa-2.0-api-1.0.0.Final.jar</code> que está na pasta <code>jpa</code> para poder utilizar as anotações do Java EE. Caso você va usar o MySQL, também precisa <a href="http://dev.mysql.com/downloads/connector/j/">fazer o download do driver JDBC</a> para ele.</p>
<p>Ainda não terminou. Precisamos do nosso logging funcionando. Se você tentar executar algum exemplo agora, vai receber o conhecido <em>Exception in thread &#8220;main&#8221; java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder</em>. O SL4J, usado pelo Hibernate, é uma casca para as outras ferramentas de logging, e precisa então de um jar que indique qual logger será utilizado como backend. Na <a href="http://www.slf4j.org/dist/">página de distribuições do SL4J</a> você deve baixar a versão correspondente que está usando, seria a 1.5.8 no caso do Hibernate 3.5.0, e pegar o adaptador <code>slf4j-log4j12-1.5.8.jar</code>. Para o Hibernate 3.6.2, é necessário o  <code>slf4j-log4j12-1.6.1.jar</code>. Também precisamos do <a href="http://logging.apache.org/log4j/1.2/download.html">jar do Log4J 1.2.x</a>.</p>
<p><strong>Principais dependências opcionais</strong></p>
<p>Usar o Hibernate facilita muito o desenvolvimento com banco de dados, porém para uma performance e escalabilidade adequada <a href="http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/">é necessário ficar atento em alguns pontos fundamentais</a>, e também simples, para que ele não se torne um gargalo na sua aplicação. Dentro do diretório <code>optional</code>, destaco como essenciais o <strong>c3p0</strong> para pool de conexão e o <strong>ehcache</strong> para second level cache. O ehcache necessitará do commons-logging por sua vez.</p>
<p>Para você tirar todo o poder da JPA 2, vai querer também usar <a href="http://blogs.sun.com/ldemichiel/entry/java_persistence_2_0_proposed">a api de meta modelos</a>, e pra isso precisa do <a href="http://repository.jboss.com/maven2/org/hibernate/hibernate-jpamodelgen/1.0.0.Final/">gerador de modelos do Hibernate</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/as-dependencias-do-hibernate-3-5/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>A java.net.SocketException Broken Pipe</title>
		<link>http://blog.caelum.com.br/a-java-net-socketexception-broken-pipe/</link>
		<comments>http://blog.caelum.com.br/a-java-net-socketexception-broken-pipe/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 22:53:56 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[broken pipe]]></category>
		<category><![CDATA[c3p0]]></category>
		<category><![CDATA[connection]]></category>
		<category><![CDATA[connection pool]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=867</guid>
		<description><![CDATA[Quando começamos a programar com banco de dados, rapidamente aprendemos que devemos sempre usar um pool de conexões para acessa-lo, caso contrário podemos facilmente atrapalhar o bom funcionamento do mesmo, devido o excesso de conexões. Passamos então a usar um pool de conexões, e ao colocar o sistema em produção, nos deparamos com outro problema: <a href="http://blog.caelum.com.br/a-java-net-socketexception-broken-pipe/#more-867'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Quando começamos a programar com banco de dados, rapidamente aprendemos que devemos sempre usar um pool de conexões para acessa-lo, caso contrário podemos facilmente atrapalhar o bom funcionamento do mesmo, devido o excesso de conexões. </p>
<p>Passamos então a usar um pool de conexões, e ao colocar o sistema em produção, nos deparamos com outro problema: o <em>broken pipe</em>:</p>
<p><code>
<pre>
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2690)
...
</pre>
<p></code></p>
<p>No GUJ, são <a href="http://www.google.com.br/search?q=site%3Aguj.com.br+broken+pipe">mais de 100 mensagens a respeito de broken pipes</a>! Recentemente <a href="http://blog.tomazlavieri.com.br/">Tomaz Lavieri</a> abriu <a href="http://guj.com.br/posts/list/141603.java">um detalhado tópico</a> sobre esse mesmo assunto, que me incentivou a escrever esse post, dada sua relevância.</p>
<p>Por que essa exception acontece? São dois motivos principais:</p>
<p>O primeiro é que muitos bancos de dados possuem um timeout para conexões inativas (<a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_interactive_timeout">o padrão do MySQL é de 8 horas</a>, mas em alguns hosts isso pode estar configurado  em segundos!). Depois de determinado tempo, o banco de dados mata essa conexão ociosa numa tentativa de economizar recursos, pois conclui que alguém simplesmente a esqueceu aberta. Quando, no lado do cliente, seu pool decide usá-la, a socket rapidamente percebe que a conexão foi fechada do outro lado, foi quebrada (daí o nome <em>broken pipe</em>). Muito comum ao começar a usar um pool!</p>
<p>O <a href="http://www.mikeschubert.com/archives/2006/08/javanetsocketex.html">segundo motivo</a> é que você pode estar tratando suas transações sem o devido cuidado: esquecendo de fazer o <em>commit</em> ou o <em>rollback</em> em alguns casos. O banco de dados então pode matar essa conexão depois de algum timeout de transação, porém o seu pool não sabe disso, e quando for utilizar essa conexão, ela está quebrada!</p>
<p>Solução rápida? Configurar o seu pool  para testar se as conexões continuam válidas. No <a href="http://www.mchange.com/projects/c3p0/index.html">C3P0</a>, pool de conexões que recomendamos fortemente, quando usado com o Hibernate, basta fazer no seu <code>hibernate.cfg.xml</code>:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;property name=&quot;hibernate.connection.provider_class&quot;&gt;
  org.hibernate.connection.C3P0ConnectionProvider
&lt;/property&gt;
&lt;property name=&quot;hibernate.c3p0.min_size&quot;&gt;1&lt;/property&gt;
&lt;property name=&quot;hibernate.c3p0.max_size&quot;&gt;20&lt;/property&gt;
&lt;property name=&quot;hibernate.c3p0.timeout&quot;&gt;30&lt;/property&gt;
&lt;property name=&quot;hibernate.c3p0.idle_test_period&quot;&gt;100&lt;/property&gt;
</pre>
<p>É a configuração <code>hibernate.c3p0.idle_test_period</code> que resolve o broken pipe. Nesse caso o C3P0 fara essa verificação de maneira assíncrona: ele cria threads (3 por padrão) que checam de tanto em tanto tempo (100 segundos nesse caso) se alguma das conexões do pool está inválida (broken pipe é um dos casos). Na existência de uma conexão assim, essa será eliminada do seu pool! Você ainda pode ter um azar muito grande, pois uma conexão pode ter algum problema logo depois que a thread a verificou! Se você quer ter uma confiabilidade de 100% em relação a suas conexões, você pode configurar a variável <a href="http://www.mchange.com/projects/c3p0/index.html#testConnectionOnCheckout">testConnectionOnCheckout</a> no arquivo <code>c3p0.properties</code> que deve ser colocado no seu classpath.  Isso não é muito recomendado, pois toda vez que uma conexão é pega do pool, alguma forma de ping será feito no banco de dados para saber se ela é válida, perdendo um pouco de performance.</p>
<p>Vale lembrar de que isso não é motivo para você se descuidar no tratamento de transações, centralizando isso dentro de um interceptador/filtro que faça o uso correto do <code>try</code>, <code>catch</code> e <code>finally</code>, precavendo-se de qualquer vazamento. Transações, assim como qualquer outro recurso caro (arquivos, conexões, sockets, threads, etc&#8230;), deve ter seu ciclo de vida tratado com atenção, de preferência de maneira isolada.</p>
<p>Caso você não use Hibernate, Jerônimo Mozer mostra <a href="http://netbeando.blogspot.com/2009/03/broken-pipe-solucao-correta.html">como usar o C3P0 programaticamente</a>.</p>
<p>Mais detalhes podem ser vistos nas <a href="http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing">configurações de teste de conexões do C3P0</a>, <a href="http://www.mchange.com/projects/c3p0/index.html#hibernate-specific">detalhes do seu funcionamento com o Hibernate</a> e a <a href="http://community.jboss.org/wiki/HowToconfiguretheC3P0connectionpool">página do próprio Hibernate sobre esse pool</a>, mas que se encontra um pouco defasada. Também vemos muitos detalhes como esses no <a href="http://www.caelum.com.br/curso/fj-25-persistencia-jpa2-hibernate/">nosso curso FJ-25</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/a-java-net-socketexception-broken-pipe/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

