Mudanças entre as edições de "O Erro Broken Pipe ou Communications link failure"

De Wiki Integrator do Brasil
Ir para: navegação, pesquisa
m (Integratorhost moveu a página Erro Broken Pipe para O Erro Broken Pipe ou Communications link failure sem deixar um redirecionamento)
Linha 10: Linha 10:
 
Por exemplo, com o Hibernate, em um hibernate.cfg.xml, com o C3p0, temos o '''hibernate.c3p0.idle_test_period''' que resolve o broken pipe. No exemplo, ele checa a cada 100 segundos se a conexão está inválida:
 
Por exemplo, com o Hibernate, em um hibernate.cfg.xml, com o C3p0, temos o '''hibernate.c3p0.idle_test_period''' que resolve o broken pipe. No exemplo, ele checa a cada 100 segundos se a conexão está inválida:
  
:<property name="hibernate.connection.provider_class">
+
<pre><property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
+
  org.hibernate.connection.C3P0ConnectionProvider
:</property>
+
</property>
:<property name="hibernate.c3p0.min_size">1</property>
+
<property name="hibernate.c3p0.min_size">1</property>
:<property name="hibernate.c3p0.max_size">20</property>
+
<property name="hibernate.c3p0.max_size">20</property>
:<property name="hibernate.c3p0.timeout">30</property>
+
<property name="hibernate.c3p0.timeout">30</property>
:'''<property name="hibernate.c3p0.idle_test_period">100</property>'''
+
<property name="hibernate.c3p0.idle_test_period">100</property></pre>
  
  
 
No Pool do Tomcat, é comum vermos o erro '''Communications link failure'''. Neste caso, por exemplo, temos o atributo '''validationQuery''', além de outros testes que permitem a validação da conexão a cada '''X''' tempo, permitindo assim que o aplicativo possa analisar se a conexão está ainda ativa ou se o MySQL realizou o famoso timeout.
 
No Pool do Tomcat, é comum vermos o erro '''Communications link failure'''. Neste caso, por exemplo, temos o atributo '''validationQuery''', além de outros testes que permitem a validação da conexão a cada '''X''' tempo, permitindo assim que o aplicativo possa analisar se a conexão está ainda ativa ou se o MySQL realizou o famoso timeout.
 
+
<pre>
:<Resource auth="Container"  
+
<Resource auth="Container"  
name="jdbc/POOL"  
+
  name="jdbc/POOL"  
:    driverClassName="com.mysql.jdbc.Driver"  
+
    driverClassName="com.mysql.jdbc.Driver"  
:    maxActive="20"     
+
    maxActive="20"     
:    maxIdle="10"  
+
    maxIdle="10"  
:    maxWait="-1"  
+
    maxWait="-1"  
:    type="javax.sql.DataSource"  
+
    type="javax.sql.DataSource"  
:    url="jdbc:mysql://localhost/banco?autoReconnect=true"  
+
    url="jdbc:mysql://localhost/banco?autoReconnect=true"  
:    password="senha"     
+
    password="senha"     
:    username="usuario"   
+
    username="usuario"   
:    removeAbandoned = true
+
    removeAbandoned = true
:    validationInterval = 34000
+
    validationInterval = 34000
:    validationQuery="SELECT 1"
+
    validationQuery="SELECT 1"
:    testOnBorrow="true"  testWhileIdle="true"
+
    testOnBorrow="true"  testWhileIdle="true"
timeBetweenEvictionRunsMillis="10000"
+
  timeBetweenEvictionRunsMillis="10000"
:    minEvictableIdleTimeMillis="60000" />
+
    minEvictableIdleTimeMillis="60000" />
 
:</Context>
 
:</Context>
 +
</pre>
  
  

Edição das 22h31min de 29 de janeiro de 2016

O Erro Broken Pipe ou Communications link failure

Este erro, comum em banco de dados MySQL, ocorre por conta de um timeout padrão, no MySQL – e na Integrator, de 8 horas de conexão inativa.

O problema é comum quando o desenvolvedor não resolve em seu Pool de Conexões essa característica, seja por desconhecimento ou por esquecimento.

Para resolver, existem formas diferentes para cada framework que opera.

Por exemplo, com o Hibernate, em um hibernate.cfg.xml, com o C3p0, temos o hibernate.c3p0.idle_test_period que resolve o broken pipe. No exemplo, ele checa a cada 100 segundos se a conexão está inválida:

<property name="hibernate.connection.provider_class">
  org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">30</property>
<property name="hibernate.c3p0.idle_test_period">100</property>


No Pool do Tomcat, é comum vermos o erro Communications link failure. Neste caso, por exemplo, temos o atributo validationQuery, além de outros testes que permitem a validação da conexão a cada X tempo, permitindo assim que o aplicativo possa analisar se a conexão está ainda ativa ou se o MySQL realizou o famoso timeout.

<Resource auth="Container" 
   name="jdbc/POOL" 
    driverClassName="com.mysql.jdbc.Driver" 
    maxActive="20"    
    maxIdle="10" 
    maxWait="-1" 
    type="javax.sql.DataSource" 
    url="jdbc:mysql://localhost/banco?autoReconnect=true" 
    password="senha"    
    username="usuario"  
    removeAbandoned = true
    validationInterval = 34000
    validationQuery="SELECT 1"
    testOnBorrow="true"   testWhileIdle="true"
   timeBetweenEvictionRunsMillis="10000"
    minEvictableIdleTimeMillis="60000" />
:</Context>


Abaixo uma rápida explicação técnica:

Validação da Conexão
testOnBorrow = true - valida antes de ser usado no pool. Se não validar, ele será retirado do pool, sendo pego outro.
validationInterval = 34000 - usado para evitar o excesso de validação , apenas executar a validação no máximo nesta frequência - tempo em milissegundos . Se uma conexão está prevista para a validação , mas já foi validado anteriormente neste intervalo, não será validado novamente . Quanto maior o valor, melhor o desempenho, mas você aumenta a chance de uma conexão antiga estar sendo requisitada.
validationQuery = SELECT 1 - consulta o MySQL usando esta simples query para validar conexões do pool antes de apresenta-las ao aplicativo.


Vazamentos de Conexão

Existem várias definições de configuração para ajudar a detectar vazamentos de conexões, ajudando a resolver possíveis leaks:

removeAbandoned = true – remove conexões abandonadas se excederem o removeAbandonedTimeout . A conexão é considerada abandonada e elegíveis para retirada do pool. Conexões em banco de dados, desta forma, podem ser recuperadas a partir de aplicações que não conseguem fechar uma conexão.
removeAbandonedTimeout = 54 - tempo limite em segundos antes que uma conexão seja considerada abandonada e elegível para ser removida.
validationQuery - Vide explicação anterior.



Nota: As questões informadas neste tópico não possuem suporte na hospedagem em analisar problemas relacionados, uma vez que são considerados de conhecimento técnico do desenvolvedor.


Veja também