createStatement() criando nova conexao com o banco?

1 resposta
G

Olá amigos. Estou com uma dúvida sobre o connection.createStatement() e gostaria de uma ajuda de vocês. Vamos lah.

Tenho uma classe que tem a função de realizar a conexão com o banco de dados e me retornar um connection, o nome dessa classe eh LRFConexao, segue o codigo:

import java.sql.*;

public class LRFConexao {
    //Url de conexão
    String is_url_banco = "jdbc:microsoft:sqlserver://dbsrv:1433;databasename=LRFCidadao;user=***;password=***";
    //Classe utilizada para conexão
    String is_classe_con= "com.microsoft.jdbc.sqlserver.SQLServerDriver";
    //Faz a conexão com o banco de dados e retorna um Connection
    public Connection getConnection() throws ClassNotFoundException, SQLException
    {
        Connection vlconn_retorno=null;
        
        Class.forName(is_classe_con);
        vlconn_retorno = DriverManager.getConnection(is_url_banco);              
        return vlconn_retorno;
    }
}

Estou utilizando essa classe da seguinte forma:

(..)
vlconn_conexao = new LRFConexao().getConnection();

for(int i=0;i<50;i++){
vlstmt_query = vlconn_conexao.createStatement();
//Busca os dados
vlrst_resultado = vlstmt_query.executeQuery(vls_sql_base);
//Busco o metadado dos dados
vlrstmt_resultado = vlrst_resultado.getMetaData();
//Fechando o Statement
//vlrst_resultado.close();
//vlstmt_query.close();
}
vlconn_conexao.close();

Agora vamos o problema:
Mais ou menos a cada duas vezes que executo o createStatement(), monitorando as conexões ao banco de dados, vejo que é criada uma outra conexão. Como isso é possível se chamei o objeto de conexão somente uma vez? O createStatement() cria uma conexão interna para executar os seus processos? Algo ainda mais interessante, quando eu nao fecho o Statement (vlstmt_query.close()), mesmo fechando a conexão(vlconn_conexao.close()) as conexões realizadas (creio eu) pelo statement continuam lah. Não deveriam ser fechadas, já que a conexão foi fechada???

Agora se eu descomentar o codigo que fecha o statement

//Fechando o Statement

vlrst_resultado.close();

vlstmt_query.close();

acontece algo interessante, são criadas somente duas conexões, uma no momento da conexão e outra no momento do createStatement(), mesmo chamando o  createStatement() novamente, ficam somente duas conexoes e quando fecho a conexão, essa conexao do statement também é fechada.

Fiquei curioso sobre isso. Alguém pode ajudar esse iniciante curioso?

Se para criar um statement preciso de uma conexao, pra que o statement está criando uma conexao com o banco?

Saúde e Paz

Gastão Júnior

[color=“green”][size=“9”]*Editado para adicionar o bbcode ;)[/size][/color]

1 Resposta

G

Senhores, se alguém se interessou por esse problema, me esqueci de dizer que estou usando o drive JDBC da microsoft. Considerando isso, baixei um drive trial da atinav(http://www.atinav.com/) e somente substitui a conexão e realizei novamente o teste, olha que interessante:

  1. Estou utilizando o metodo ResultSetMetaData.getColumnClassName() para mapear os tipos do SQLServer para classes do java, constatei que esses drives mapeam os tipos de formas diferentes.

  2. No caso da conexão “extra” criada pelo createStatement() com o drive da microsoft, não é criada utilizando o drive da atinav.

Será que temos um bug no drive da microsoft???

Estarei fazendo o teste com o drive da FreeTDS.org e logo após coloco os resultados por aqui.

Saúde e Paz

Gastão

Criado 15 de setembro de 2004
Ultima resposta 16 de set. de 2004
Respostas 1
Participantes 1