[RESOLVIDO] Liberar porta depois da desconexão  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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:

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)

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

This message was edited 1 time. Last update was at 07/10/2009 14:56:23


[]'s, Renata
[Email]
Thiago MuiLoko
JavaBaby
[Avatar]

Membro desde: 01/07/2009 07:42:12
Mensagens: 82
Offline

Realmente, se vc não fechar elas vão ficar abertas mesmo.

Utiliza um bloco finally e utilize o comando close(), exemplo



Da uma olhada na APi que tem os esquemas de fechar.

Espero ter ajudado,

Abs
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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?

[]'s, Renata
[Email]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

http://mail-archives.apache.org/mod_mbox/activemq-users/200607.mbox/%3C4e6f67720607140610x741ea7a6xddc5125293bb3429@mail.gmail.com%3E
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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

[]'s, Renata
[Email]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

Olá amigos!

Ngn mais se manifestou, mas meu problema ainda não foi resolvido, então estou aqui, "gritando" denovo...

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

[]'s, Renata
[Email]
clone_zealot
JavaEvangelist

Membro desde: 21/11/2004 16:40:00
Mensagens: 424
Offline

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.

"Não amo a espada por sua agudez,
não amo a flecha por sua rapidez,
não amo o homem por sua glória,
amo sim, tudo o que eles defendem"
Faramir, Príncipe de Ithilien
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

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
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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

[]'s, Renata
[Email]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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

[]'s, Renata
[Email]
RenataFA
Virtual Machine Man
[Avatar]

Membro desde: 24/08/2006 08:15:10
Mensagens: 698
Offline

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!

[]'s, Renata
[Email]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team