Connection timed out, URGENTE

Erro fatal:

java.sql.SQLException: Network error IOException: Connection timed out

Na empresa na qual trabalho temos um sistema web multi-database, temos um problema grave que nem consultor está conseguindo resolver, a pessoal rede fala que é aplicação e o DBA também, já viu né.

Atualmente o esquema de conexão é a seguinte.
Hibernate + c3po

Tudo é montado dinamicamente: ± assim

private Properties getClienteProperties(ConfiguracaoCliente config) {
Properties retorno = new Properties();

    retorno.put("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
    retorno.put("hibernate.c3p0.acquire_increment", "1");
    retorno.put("hibernate.c3p0.idle_test_period", "180");
    retorno.put("hibernate.c3p0.max_size", "300");
    retorno.put("hibernate.c3p0.max_statements", "100");
    retorno.put("hibernate.c3p0.min_size", "0");
    retorno.put("hibernate.c3p0.checkoutTimeout","1");
    retorno.put("hibernate.c3p0.timeout", "120");
    retorno.put("hibernate.c3p0.initialPoolSize","0");
    retorno.put("hibernate.connection.driver_class", "net.sourceforge.jtds.jdbc.Driver");
    retorno.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
    retorno.put("hibernate.connection.password", config.getSenha());
    retorno.put("hibernate.connection.username", config.getUsuario());
    retorno.put("hibernate.use_sql_comments", "false");
    retorno.put("hibernate.connection.url", "jdbc:jtds:sqlserver://" + config.getIp() + "/" + config.getDatabase());
    retorno.put("hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext");
    if (show_sql) {
        retorno.put("hibernate.show_sql", "true");
    } else {
        retorno.put("hibernate.show_sql", "false");
    }

    return retorno;
}

o método que chama:

private SessionFactory buildSession(ConfiguracaoCliente cliente) {
SessionFactory sessaoF = null;
/if (existeDatabase(cliente)) {/
Configuration configuration = getConfiguration(cliente);
configuration.addProperties(getClienteProperties(cliente));
try {
sessaoF = configuration.buildSessionFactory();
} catch (HibernateException e) {
Logger.getLogger(ConexaoFacade.class.getName()).log(Level.SEVERE, null, e);
}
/*
} else {
System.out.println("Database " + cliente.getDatabase() + " não existe no servidor: " + ipPadrao);
}*/
return sessaoF;
}

A aplicação vai numa boa roda as vezes dias… e deRepete !!!

//////////////*************
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] – caught unexpected Exception while executing posted task.
java.lang.NullPointerException
java.sql.SQLException: Network error IOException: Connection timed out
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:372)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:178)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:68)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:87)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.acquireResource(C3P0PooledConnectionPool.java:83)
at com.mchange.v2.resourcepool.BasicResourcePool.assimilateResource(BasicResourcePool.java:884)
at com.mchange.v2.resourcepool.BasicResourcePool.acquireUntil(BasicResourcePool.java:601)
at com.mchange.v2.resourcepool.BasicResourcePool.access$400(BasicResourcePool.java:31)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1079)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1298.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:289)
at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:250)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:297)
… 10 more
java.sql.SQLException: Network error IOException: Connection timed out
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:372)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:178)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:68)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:87)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.acquireResource(C3P0PooledConnectionPool.java:83)
at com.mchange.v2.resourcepool.BasicResourcePool.assimilateResource(BasicResourcePool.java:884)
at com.mchange.v2.resourcepool.BasicResourcePool.acquireUntil(BasicResourcePool.java:601)
at com.mchange.v2.resourcepool.BasicResourcePool.access$400(BasicResourcePool.java:31)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1079)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:354)
//////////////*************

O servidor trava… essa aplicação e outras que estão no mesmo servidor travam!!!

Algum guru…
É urgente mesmo…

Valeu!!!

Quando for postar códigos, use a tag code:
[code]
Seu código aqui
[/code]

Não poste tópicos com títulos contendo as palavras “URGENTE, SOCORRO, AJUDA, etc…”

Conexões ficam abertas por muito tempo no pool. Isso faz com que o servidor de BD as feche por ociosidade. Não adianta mudar os timeouts do servidor, pois ele poderá fechar conexões abaixo desse timeout caso esteja carregado.

Para prevenir esse problema, habilite o teste de conexão do C3P0.
http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

Ele irá rodar uma consulta boba no seu banco (como SELECT 1; ) antes de entregar uma conexão, só para ter certeza de que ela ainda está funcionando. Se não estiver, o próprio pool a reciclará.

Vou colocar isso no deploy hj a noite e aguardar alguns dias pra ver se a aplicação cairá… pq como disse o erro acontece de 1 dia ou até uma semana.
Muito obrigado mesmo, valeu pela força!

Fiz uns testes aqui com as propriedades
hibernate.c3p0.idleConnectionTestPeriod mas ele depende da propriedade hibernate.c3p0.timeout (logicamente) ou seja…

a configuração atual do servidor é 1 de connection timeout, propositalmente para descartar locks de conexão, cada conexão não utilizada em 1 segundo e fechada com, forçando o c3po a utilizar novas conexões, e ainda sim não deu certo.

No momento do colapso da aplicação fiz uma verificação junto com o DBA no auditoria R2 do sqlServer constata-se que o pedido de conexão chega ao servidor mas é fechado em instantes, a aplicação fica incomunicavel mas o sql continua recebendo conexões que não sejam do servidor (tomcat) em questão.

Mistério…
A aplicçaão já está pronta para utilizar JNDI, falta criar os arquivos JNDI no servidor cerca de 150, uma migração para JBOSS + JNDI está prevista e está sendo protelada justamente por este mistério, não quero migrar sem descobrir o erro, estou ficando sem alternativas.Vlws.

Vlws…

Pra melhorar o diagnostico, tente mudar o log4j para imprimir mais dados sobre as conexoes. Por exemplo, tente usar um “INFO”. Mas tome cuidado e tente usar um file roller, pq eh possivel que o seu log cresca muito :slight_smile:

Algum motivo por estarem usando um “acquire_increment” de 1 ? Eu colocaria um acquire_increment de uns 3, ja que vc provavelmente vai usar (se sua aplicacao for razoavelmente usada).
E “initialPoolSize”, tem motivo para estar 0 ? Eu deixaria com uns 10, considerando que vc tem 300 como max_size.
O max_size, inclusive, me parece um pouco algo. Quantos usuarios simultaneos vc espera na sua aplicacao?

O que significa “o servidor trava”? O servidor nao responde mais a ping?

A aplicação fica repetindo “java.sql.SQLException: Network error IOException: Connection timed out” e a aplicação via browser não funciona.
A impressão é que o tomcat trava mas o log diz que não, não apresenta java heap space nem nada, somente o erro acima citado.

Fico desconfiado do firewall… será que teria possibilidade?

essa configuração atual do c3po não é a de produção real, ela está no momento em produção para forçar sempre novas conexões, porque o erro já acontecia com a configuração a seguir:

    retorno.put("hibernate.c3p0.acquire_increment", "5");
    retorno.put("hibernate.c3p0.idle_test_period", "180");
    retorno.put("hibernate.c3p0.max_size", "200");
    retorno.put("hibernate.c3p0.max_statements", "100");
    retorno.put("hibernate.c3p0.min_size", "5");
    retorno.put("hibernate.c3p0.checkoutTimeout","0");
    retorno.put("hibernate.c3p0.timeout", "1800");

Isso significa que o C3P0 fica tentando buscar uma conexao, mas nao consegue. Dai tenta de novo, e nao consegue. E por ai vai. Se voce acha que o problema eh de rede, voce pode fazer um “cron” que roda de minuto em minuto para checar seu log. Se o problema esta acontecendo, comeca a gravar “pings” do servidor onde esta sua aplicacao para o servidor de banco de dados. Estes pings podem ser tanto o comando “ping” quanto uma aplicacao Java “standalone” que faz uma conexao na mao com o banco de dados (sem usar connection pooling). Se o ping funcionar, nao eh rede :slight_smile: