Em suas propriedades de configuração, você usou a propriedade c3p0 maxIdleTime, mas as propriedades c3p0 são configuradas usando
c3p0.
prefixo ou hibernate.c3p0.
. Observe que ativar qualquer um dos c3p0
properties habilita automaticamente o provedor de conexão correspondente por heurística de hibernação. No log não é visto que você está usando c3p0. Se você não tiver fontes de dados configuradas, o Hibernate usará hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
. Este provedor de conexão possui um pool de conexão rudimentar embutido para o qual você pode definir um hibernate.connection.pool_size
, mas é usado apenas para fins de desenvolvimento. Nunca use no ambiente de produção. Você pode ter discussões intermináveis sobre o tópico How to fix java.net.SocketException:Broken pipe . Depois de algum tempo, você perceberá que permaneceu aberto conexões no pool, que são repentinamente fechadas do outro lado pelos seguintes motivos:
- Firewalls ou roteadores podem bloquear conexões ociosas (o protocolo cliente/servidor MySQL não funciona).
- O MySQL Server pode estar fechando conexões ociosas que excedem o
wait_timeout
ouinteractive_timeout
limite.
Para ajudar a solucionar esses problemas, as dicas a seguir podem ser usadas:
- É usada uma versão recente (5.1.13+) do driver JDBC.
- Certifique-se de que
wait_timeout
einteractive_timeout
estão suficientemente altos. Verifique seinteractiveClient
é usado. - Certifique-se de que
tcpKeepalive
está ativado. - Certifique-se de que qualquer configuração configurável de tempo limite de firewall ou roteador permita o tempo máximo de inatividade de conexão esperado.
- Certifique-se de que as conexões sejam válidas quando usadas no pool de conexões. Use uma consulta que comece com
/* ping */
para executar um ping leve em vez de uma consulta completa. Observe que a sintaxe do ping precisa ser exatamente como especificada aqui. - Valide explicitamente a conexão antes de usá-la se a conexão tiver ficado inativa por um longo período de tempo.
- Minimize a duração de um objeto de conexão que fica ocioso enquanto outra lógica de aplicativo é executada.
Para cumprir algumas dessas opções, é melhor usar um pool de conexões que você pode usar com o Hibernate. O Hibernate tem suporte para commons-dbcp, c3p0 e proxool. Além disso, você pode configurar a fonte de dados JNDI no servidor da Web para usar com hibernação, pois possui um pool de conexões. Consulte o Capítulo 7 Pool de conexões com conector/J .
Se você gosta de configurar o Hibernate com c3p0, leia este Como configurar o pool de conexão C3P0 . Para configuração de exemplo dbcp, você deve verificar esta postagem MySQL, Hibernate and Broken Pipe Exception . Qualquer pool de conexão que você usará depende de você.