dave: DB-Connection schliessen und trotzdem ResultSet zurückgeben

Hallo liebes Forum,

meine Frage behandelt zwar Java, aber ich hoffe ihr könnt mir trotzdem weiterhelfen.

Also ich habe eine Methode, die das DB-ResultSet zurückgeben soll, und nach der Anfrage die Verbindung schliessen soll.
//Code:
 public ResultSet getDBData(String query){
  ResultSet rs_tmp;
  Connection cn = this.getConnection();
  try{
   Statement st = cn.createStatement();
   ResultSet rs = st.executeQuery(query);
   rs.close();
   st.close();
   cn.close();
   return rs;
  } catch (SQLException e){
   error = true;
   errorMsg = e.getMessage();
  }
 }

Leider meldet der Compiler, dass eine Rückgabe von "rs" nach dem schliessen nicht mehr möglich ist.

Meine Frage daher: Wie ist es möglich das ResultSet zurückzugeben und die DB-Connection zu schliessen?

vielen Dank für eure Hilfe....

  1. Leider meldet der Compiler, dass eine Rückgabe von "rs" nach dem schliessen nicht mehr möglich ist.

    Meine Frage daher: Wie ist es möglich das ResultSet zurückzugeben und die DB-Connection zu schliessen?

    Die Reihenfolge der Anweisungen ändern?   ;)

    1. Hallo King^Lully,

      vielen Dank für deine Antwort.

      Leider habe ich mit

      Die Reihenfolge der Anweisungen ändern?   ;)

      nicht sehr viel angefangen. Kannst du dies bitte näher erläutern?

      grüße
      dave

      1. Mach mal
            return rs;
        bevor Du die Objekte closed.

        1. Mach mal
              return rs;
          bevor Du die Objekte closed.

          naja, da wird die Connection nicht wieder geschlossen :-(

          1. Mach mal
                return rs;
            bevor Du die Objekte closed.

            naja, da wird die Connection nicht wieder geschlossen :-(

            Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)

            1. Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)

              Hab jetzt doch mal einen näheren Blick auf den Code geworfen, was geht denn da genau ab? Mal erläutern...

              1. also:
                Die Ganze Klasse ist als Singleton angelegt.
                getConnection() lädt den JDBC-Treiber und stellt eine Verbindung zur DB her.
                //kommentierter Code:
                 public ResultSet getDBData(String query){
                  //Verbindung aufbauen
                  Connection cn = this.getConnection();
                  try{
                   //Die normalen DB-Methoden
                   Statement st = cn.createStatement();
                   //query ist SQL-Anfrage
                   ResultSet rs = st.executeQuery(query);
                   //Schliessen
                   rs.close();
                   st.close();
                   cn.close();
                   //Hier sollte das ResultSet übergeben werden, um nachher einen HTML-Table zu erzeugen
                   return rs;
                  } catch (SQLException e){
                   //Fehlerbehandlung
                   error = true;
                   errorMsg = e.getMessage();
                  }
                 }

                1. Ich kenne mich mit Java nicht aus, aber ein paar Anmerkungen:

                  Die Ganze Klasse ist als Singleton angelegt.

                  Ein Singleton ist eine einelementige Menge, vermute mal, dass das eine Klasse ist, die nur einmalig instaziiert werden kann, korrekt?

                  public ResultSet getDBData(String query){
                    //Verbindung aufbauen
                    Connection cn = this.getConnection();

                  Greifst Du auf eine bestehende Verbindung zurück, wo ist der Connection-String?

                  try{
                     //Die normalen DB-Methoden
                     Statement st = cn.createStatement();
                     //query ist SQL-Anfrage
                     ResultSet rs = st.executeQuery(query);

                  So, jetzt hast Du die Datensatzmenge.

                  //Schliessen
                     rs.close();
                     st.close();
                     cn.close();
                     //Hier sollte das ResultSet übergeben werden, um nachher einen HTML-Table zu erzeugen
                     return rs;

                  Jetzt gibst Du zu spät das rs zurück, denn dieses ist ja gerade geschlossen worden.

                  } catch (SQLException e){
                     //Fehlerbehandlung
                     error = true;
                     errorMsg = e.getMessage();
                    }
                  }

                  Wird die Fehlermeldung zurückgegeben?

                  1. danke für deine Bemühungen.
                    Sofern die Connection beendet wird, ist auch das ResultSet weg.
                    Daher muss man vorher etwas "überstülpen" wie zB ein RowSet.
                    //Code (sollte jemand vor einem ähnlichen Problem stehen):
                    ...
                    import com.sun.rowset.CachedRowSetImpl;
                    ...
                     public CachedRowSetImpl getDBRowSet(String query){
                      CachedRowSetImpl rset;
                      Connection cn = this.getConnection();
                      try{
                       rset = new CachedRowSetImpl();
                       Statement st = cn.createStatement();
                       ResultSet rs = st.executeQuery(query);
                       rset.populate(rs);
                       rs.close();
                       st.close();
                       cn.close();
                       return rset;
                      } catch (SQLException e){
                       e.printStackTrace();
                      }
                      return null;
                     }

            2. Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)

              Das würde gehen, darf ich aber nicht. Steht eindeutig in der Angabe.
              Ich denke ich muss dies mit einem Array oder ähnlichem lösen. RowSet?

    2. Hallo,

      Die Reihenfolge der Anweisungen ändern?   ;)

      Dieter Nuhr!

      Gruß
      Slyh

      1. Die Reihenfolge der Anweisungen ändern?   ;)

        Dieter Nuhr!

        Häh, der Kabarettist? Verstehe ich nicht.

        Aber Dir ist schon aufgefallen, dass die Objekte geschlossen werden bevor das RecordSet zurückgegeben wurde?