Bom dia!
Tenho uma rotina que roda de tempos em tempos, processando uma fila de tarefas. A cada tarefa que ela processa, eu conecto no BD, processo o que preciso e desconecto. Sei que a rotina está perfeita, funciona bem sem problemas. Tenho inclusive clientes em uso já com essa rotina, em MySQL.
Acontece que nosso sistema roda com vários BDs, e agora estava eu testando tudo pq um cliente passará a usar essa mesma rotina, mas com SQLServer. E com SQLServer eu tive um problema, durante a execução da rotina, ele funciona bem por um tempo e de repente dá a seguinte mensagem de erro justamente no momento em que tenta fazer uma conexão com o BD:
[quote]STACK TRACE:
java.sql.SQLException: Network error IOException: Address already in use: connect
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:385)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:182)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
[/quote]
Pesquisei e descobri que esse erro se refere ao fato de a máquina não ter nenhuma porta disponível para usar para conectar com o BD. Então eu fui no prompt do MS-DOS, e dei o famoso comando “netstat”. Qual foi minha surpresa quando vi uma lista enorme de portas abertas com o IP do meu servidor de dados SQLServer! Praticamente todas no estado TIME_WAIT. Fechei todo o sistema, percebi que não muda nada… então fiquei olhando e notei que ele tem uma espécie de “tempo” pra liberar as portas que estão como TIME_WAIT, ou seja, não estão mais sendo usadas, mas também não foram liberadas ainda pelo windows. Elas ficam ali, “esperando dar seu tempo”.
Depois de um tempo vi que todas as TIME_WAIT foram liberadas, ai rodo o sistema e tudo funciona normalmente até estourar o limite de portas mais uma vez.
Por favor, eu uso o sistema com MySQL, Oracle e SQLServer. Até agora, só o SQLServer apresentou essa situação. Alguém sabe o que posso fazer? Algo que eu possa fazer pra forçar o Windows a liberar essa porta que não estou mais usando já no ato da desconexão com o BD?
Grata,
Renata
Realmente, se vc não fechar elas vão ficar abertas mesmo.
Utiliza um bloco finally e utilize o comando close(), exemplo
.
.
.
finally
{
nomeDaConexao.close();
}
Da uma olhada na APi que tem os esquemas de fechar.
Espero ter ajudado,
Abs
Amigo, acho que vc não entendeu. Não são minhas conexões que ficam abertas, eu as fecho, isso está ok!
O que fica aberta são as portas do windows, ficam abertas naquele status TIME_WAIT, ou seja, não estão mais sendo usadas (justamente pq fechei minhas conexão), mas tb não foram liberadas. E isso só com o SQLServer.
Alguma idéia?
Olá!
Eu dei uma olhada no link que vc me passou, não entendi ao certo. Me deu a impressão de que é uma forma de “melhorar o problema”, não de resolvê-lo definitivamente.
Como faço pra testar? Isso é um daqueles drivers que eu tenho que baixar e atualizar o servidor de dados não é? Tenho um conhecido aqui que disse que já tentou e que não foi bom usando esse driver, então estou bem enrolada sobre o que fazer.
Alguns dados:
Uso SQLServer 2005 e jtds-1.2.3.jar
Grata,
Renata
Olá amigos!
Ngn mais se manifestou, mas meu problema ainda não foi resolvido, então estou aqui, “gritando” denovo… :roll:
Consegui observar mais alguns detalhes que talvez ajude a resolver. O fato é que rodei a mesma rotina, acessando o mesmo banco de dados, de máquinas diferentes e observei que só na minha máquina ocorre o problema!
O SQLServer 2005 está instalado em um servidor com Windows Server 2003.
Eu testei de uma máquina Windows Server 2008 Standard e testei de uma máquina com Windows Vista. Em ambas funcionou normalmente. Só na minha máquina que ocorre o problema. Minha máquina é um Windows XP Professional SP 3.
Isso ajuda em algo?
Grata,
Renata
Bem, o que eu posso te ajudar é com informações.
O Windows Vista, assim como o Server, têm uma nova implementação da pilha TCP. Isso pode ser a resposta do pq funciona no Vista e no Server, mas não no XP.
O que posso te indicar é testar isso em uma outra máquina com o Windows XP.
Hum… deve haver algum parâmetro no registry do Windows XP que permita que o TIME_WAIT fique por menos tempo ativo e “simule” esse comportamento do Vista e Server 2008… Pelo que vi, o parâmetro é TcpTimedWaitDelay:
http://support.microsoft.com/kb/328476
Ei amigo, li o link que vc passou, tá com kra de que isso resolve meu problema hein!
Só me ajudem com mais uma coisa… onde eu posso alterar o valor de MaxUserPort e TcpTimedWaitDelay?
Não entendi onde eu entro pra alterar esses valores. Alguém sabe?
Grata
Renata
Acho que encontrei! Para alterar o TcpTimedWaitDelay, sigam as dicas:
(procure por TcpTimedWaitDelay)
http://arenammo.com.br/forums/aion/45271-melhorando-conexao.html
http://www.secret.com.br/phpBB2/viewtopic.php?t=232763&sid=5f7433de82801b64b26682e2f21e689b
Depois é reiniciar e testar.
Vou fazer isso, depois conto se deu certo.
Até já!
TESTADO!!!
Funciona msm! Era isso, agora ele não fica tanto tempo segurando a porta de conexão e não esgota as portas. Muito bom gente!!!
Só seguir as dicas que funciona.
Obrigada pela ajuda de todos! 