[ RESOLVIDO ]Varios select em um executeQuery

14 respostas
Pscodelico
Olá a todos, não sei se estou postando este tópico no local correto. Se estiver no local errado peço antecipadamente minhas desculpas. Eu tenho um arquivo .sql onde tenho varias inicializações de dblink_connect tipo o abaixo :
SELECT dblink_connect('loja1','dbname=meuBanco hostaddr=127.0.0.1 user=meuUsuario password=minhaSenha port=5432');
Faço a leitura desse arquivo com todos os select e passo para o executeQuery
public void executeSqlScript(InputStream stream) {
        String contentStr;
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(stream));

            String line = null;
            StringBuffer strBuffer = new StringBuffer();
            while ((line = in.readLine()) != null) {
                strBuffer.append(line);
                strBuffer.append('\n');
            }

            contentStr = strBuffer.toString();
            
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        String sql = contentStr;
        ConexaoPrincipal c = new ConexaoPrincipal();
        c.conectar();
        c.executesSQL(sql);
    }
esta causando o seguinte erro => ResultSets múltiplos foram retornados pela consulta

alguem poderia mim ajudar ?
Desde já agradeço.

14 Respostas

victormagno

Voce deve estar usando um prepared statement executeQuery no seu método… se tiver vários comandos num statement so da esse erro…

Segue um exemplo googlado de como executar varios comando sql num statement e manipular os diveros ResultSets, vê se te ajuda:

public static void executeStatement(Connection con) {
   try {
      String SQL = "SELECT TOP 10 * FROM Person.Contact; " +
                   "SELECT TOP 20 * FROM Person.Contact";
      Statement stmt = con.createStatement();
      boolean results = stmt.execute(SQL);
      int rsCount = 0;

      //Loop through the available result sets.
     do {
        if(results) {
           ResultSet rs = stmt.getResultSet();
           rsCount++;

           //Show data from the result set.
           System.out.println("RESULT SET #" + rsCount);
           while (rs.next()) {
              System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
           }
           rs.close();
        }
        System.out.println();
        results = stmt.getMoreResults();
        } while(results);
      stmt.close();
      }
   catch (Exception e) {
      e.printStackTrace();
   }
}

Editei pq o digitei varias coisas erradas… To cel…

Pscodelico

É foi realmente isso que ocorreu.

Fiz as alterações e rodou.
Obrigado.

Só fiquei com a seguinte questão agora pois rodei o script que cria as conexoes

quando vou no Banco e consulto se as conexões estão criadas elas não aparecem.

victormagno

Não sei se entendi exatamente o que você quis dizer, mas… essas conexões provavelmente não estarão visiveis na sua base de dados. Elas são abertas pela sua aplicação para que possa se conectar ao bd e deixam de existir quando são fechadas ou quando seu tempo de vida acaba (timeout). Não sei em que momento vc consultou isso no banco… durante a execução da sua app ou depois.

Pscodelico

Estou abrindo as conexões na inicialização do aplicativo para utiliza-las ao longo na aplicação e quando fechar a aplicação fechar as conexões.
E consultei com a aplicação aberta.

victormagno

Você está usando PostgreSQL, certo? Como você fez para visualizar as conexões, SELECT * FROM pg_stat_activity;?

Dá uma olhada aqui:

http://www.postgresql.org/docs/9.2/static/monitoring-stats.html

Pscodelico

Sim estou usando o PostgreSQL.
O comando para visualizar conexões abertas do DB_LINK é

e para fechar é

victormagno

Cara, usa esse select:

SELECT * FROM pg_stat_activity;

Pscodelico

Esse select ele mim mostra a minha conexão do “pgAdmin III - Browser”

victormagno

Mesmo se você colocar o dblink_get_connections no final do ser arquivo .sql não aparece?

Pscodelico

Sim aparece, só não aparece quando consulto no pgAdmin III

victormagno

Humm… pelo que eu entendi, essas conexões que você criou via dblink_connect ficam limitadas à sessão que você está utilizando. Uma vez que você as criou através de sua aplicação, elas estarão disponíveis somente enquanto a conexão que você usou para executar o .sql estiver aberta. Ao acessar pelo pgAdmin você inicia uma nova sessão e os dblink_connect que você criou não estão disponíveis.

http://www.postgresql.org/docs/9.1/static/contrib-dblink-connect.html

Pscodelico

Então já que minha preocupação era não deixar elas abertas.Posso nos selects normais que faço a junção logo no inicio fazer as conexões já que elas se fecham ao encerrar a sessão.

victormagno

Por mais que as conexões sejam fechadas ao término da sessão, o ideal é sempre liberar os recursos que você aloca. Talvez havendo uma exceção conexões possam permanecer abertar e se acumular. Recursos alocados sem uso são um custo desnecessário para a aplicação / banco.

O ideal é utiliza o recurso e logo em seguida liberá-lo.

Pscodelico

Ok muito obrigado pela ajuda.

Criado 1 de novembro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 14
Participantes 2