2 Stimmen

Wann wird ResultSet geschlossen?

Ich möchte wissen, ob ResultSet geschlossen werden kann, wenn ich es nicht geschlossen habe? Ich habe eine "ResultSet is closed"-Ausnahme, aber ich bin sicher, dass ich das ResultSet nirgendwo geschlossen habe. Was ich genau tue, ist, dass ich das ResultSet verwende, um eine SELECT-Abfrage durchzuführen, und dann das gleiche ResultSet verwende, weil es von dieser Methode aufgerufen wird:

public Object getValueAt( int row, int column )
        throws IllegalStateException {
    // ensure database connection is available
    if ( !dbConnection.isConnectedToDatabase() )
        throw new IllegalStateException( "Not Connected to Database" );

    // obtain a value at specified ResultSet row and column

    try {
        getResultSet().absolute( row + 1 );
        return getResultSet().getObject( column + 1 );
    } // end try
    catch ( SQLException sqlException ) {
        System.out.println("Exception from here dude");
        sqlException.printStackTrace();
    } // end catch

    return ""; // if problems, return empty string object
} // end method getValueAt

Also, eine andere Frage: Gibt es eine Möglichkeit, um sicherzustellen, dass das ResultSet geöffnet wird?

Dritte Frage: Vielleicht liegt das Problem daran, dass ich ResultSets nie schließe.

Welchen Sinn hat das Schließen von ResultSet?

Bearbeiten : So wird die Anweisung im Konstruktor einer Klasse namens DBConnection erstellt:

Class.forName(driver);
        // connect to database
        connection = DriverManager.getConnection(url, username, password);

        // create Statement to query database
        statement = connection.createStatement(
     ResultSet.TYPE_SCROLL_INSENSITIVE,
     ResultSet.CONCUR_READ_ONLY );

        //connection ok
        connectedToDatabase=true;

ResultSet wird später erstellt, wenn ich eine Anweisung ausführen möchte.

9voto

mdrg Punkte 3180

Direkt von [die Dokumentation zu ResultSet.close()](http://download.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#close()) :

Gibt die Datenbank- und JDBC-Ressourcen dieses ResultSet-Objekts sofort frei, anstatt darauf zu warten, dass dies beim automatischen Schließen geschieht.

...

Hinweis: Ein ResultSet-Objekt wird automatisch von dem Statement-Objekt geschlossen, das es erzeugt hat, wenn dieses Statement-Objekt geschlossen oder erneut ausgeführt wird oder wenn es verwendet wird, um das nächste Ergebnis aus einer Folge von mehreren Ergebnissen abzurufen.

Wenn Sie also die Anweisung, die Ihr ResultSet erzeugt hat, geschlossen haben, erhalten Sie diese Ausnahme.

Antwort auf eine andere Frage: Sie sollten die Ergebnisse aus einem ResultSet nicht auf diese Weise lesen. Führen Sie die Auswahl durch und lesen Sie alle Daten, die Sie benötigen, auf einmal aus dem ResultSet, schließen Sie die Verbindung und lesen Sie dann später die abgerufenen Daten so viel Sie wollen. Sie sollten wirklich nicht eine externe Ressource/Klasse haben, die Ihre getValueAt Methode, von der Sie erwarten, dass sie noch mit der Datenbank verbunden ist. Die Verbindung kann aus vielen anderen Gründen abgebrochen werden, daher ist das nicht der richtige Weg.

Dritte Antwort: siehe oben.

Letzte Antwort: explizite Freigabe von Ressourcen, ohne darauf zu warten, dass sie geschlossen werden, wenn eine Erklärung vorliegt.

-1voto

Swaranga Sarma Punkte 12575

Wenn Sie eines der folgenden Elemente geschlossen haben, wird Ihr ResultSet automatisch geschlossen:

  1. Gegenstand der Erklärung.
  2. Verbindungsobjekt.

Ich habe den starken Verdacht, dass die Verbindung geschlossen wird. Es ist eine natürliche Tendenz, die Datenbankverbindung zu schließen, sobald die Abfrage ausgeführt wurde. Das ist zwar eine gute Praxis, aber möglicherweise schließen Sie die Verbindung, noch bevor Sie das ResultSet-Objekt in Ihrer TableModel-Klasse verwendet haben.

-1voto

Ich schließe Verbindungen, ResultSets und Statements immer in einem finally {} Block. In diesem Fall habe ich dieses Problem nicht, da dieser Block immer ausgeführt wird (nun, nicht immer, aber hier passt es). Bitte beachten Sie dies Beitrag Ich habe eine skelettierte Implementierung erstellt, die für Sie interessant sein könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X