[RESOLVIDO] Liberar porta depois da desconexão

10 respostas
R

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:

<blockquote>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)

</blockquote>

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

10 Respostas

T

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

R

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?

E

http://mail-archives.apache.org/mod_mbox/activemq-users/200607.mbox/<[email removido]>

R

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

R

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

C

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.

E

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

R

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

R

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á!

R

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! :wink:

Criado 29 de setembro de 2009
Ultima resposta 7 de out. de 2009
Respostas 10
Participantes 4