O Erro Broken Pipe ou Communications link failure
- 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.