Gostaria de saber como fexar as conexões ao banco de dados SQL

3 respostas
N

Tenho os seguinte metodo:

public static String ler(String table, String colunaoriginal, String colunapesq, String pesq) {

try {

Class.forName(net.sourceforge.jtds.jdbc.Driver);

Connection conn = DriverManager.getConnection(Variavel.DB_Backoffice, Variavel.user_DB, Variavel.pass_DB);

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(SELECT " + colunaoriginal + " FROM " + table + " where " + colunapesq + " like '” + pesq + “’”);

while (rs.next()) {

Variavel.ret_DB = rs.getString(colunaoriginal);

}

rs.close();

stmt.cancel();

stmt.close();

conn.close();

} catch (Exception e) {

}

return Variavel.ret_DB;

}

Há outros metodos para ler de outras formas, escrever de outras formas no DB mas seguinte, todas usam a conexão conn para fazer a pesquisa, porém há várias maquinas usando este programa e algumas estão dando o erro SQLException IOException - Network Connection Already in Use.

Depois fui procurar ver, e no netstat das máquinas está lotado de conexões time_wait ao serivdor SQL.
Minha duvida, há algum meio de eu fexar está conexão que foi aberta logo depois de extrair os dados que eu preciso? ou porque as conexões estão ficando abertas e não estão sendo close?

Obrigado!

3 Respostas

C

Tenta conn.close();

ViniGodoy

Tem sim, e não é tão trivial. Você teria que substituir os seus ResultSets por cachedRowSets, e usar o conn.close() dentro de um finally.

Não é possível escapar dessa substituição pois o resultset trabalha com o cursor do banco de dados, enquanto o CachedRowSet copia esses dados para a memória, numa única etapa.

Há um tempo atrás alguém já abriu um tópico sobre esse assunto:
http://www.guj.com.br/posts/list/198030.java

Agora, implementar isso no braço é muito complicado. Isso porque abrir e fechar conexões o tempo todo é lento, então seria adequado que você fizesse a integração com algum pool de conexões. O que vai tornar o seu método mais difícil de gerenciar. Também seria adequado que você lidasse corretamente com transações, para evitar que SQLs relacionados sejam executados em conexões diferentes, e que você garantisse também thread-safety.

Sugiro que você dê uma olhada no Spring, que já implementa esse conceito e tem forma de trabalhar muitíssimo similar a do próprio Java. Fazer a substituição é extremamente simples:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/

N

ViniGodoy:
Tem sim, e não é tão trivial. Você teria que substituir os seus ResultSets por cachedRowSets, e usar o conn.close() dentro de um finally.

Não é possível escapar dessa substituição pois o resultset trabalha com o cursor do banco de dados, enquanto o CachedRowSet copia esses dados para a memória, numa única etapa.

Há um tempo atrás alguém já abriu um tópico sobre esse assunto:
http://www.guj.com.br/posts/list/198030.java

Agora, implementar isso no braço é muito complicado. Isso porque abrir e fechar conexões o tempo todo é lento, então seria adequado que você fizesse a integração com algum pool de conexões. O que vai tornar o seu método mais difícil de gerenciar. Também seria adequado que você lidasse corretamente com transações, para evitar que SQLs relacionados sejam executados em conexões diferentes, e que você garantisse também thread-safety.

Sugiro que você dê uma olhada no Spring, que já implementa esse conceito e tem forma de trabalhar muitíssimo similar a do próprio Java. Fazer a substituição é extremamente simples:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/

Muito Obrigado!
Amanhã pela manhã irei verificar essas informações que você passou e irei coloca las nos meus metodos e irei ver o que se resolve com isso…

Criado 24 de fevereiro de 2010
Ultima resposta 24 de fev. de 2010
Respostas 3
Participantes 3