SQLite ResultSet closed -- Wiederholende DB-Abfragen

Jochim

Mitglied
Guten Abend,

ich arbeite mit einem RFID-Kartenleser und immer wenn eine Karte gelesen wird, wird eine DB-Abfrage nach der ID des Produktes gemacht.

Java:
public String getID(String rfid){
        conn=JavaConnection.ConnecrDB();
        String ID;
        System.out.println("Methode: searchRFID");
        String sql="";
        try{
            sql="SELECT ID,RFID FROM products WHERE RFID=?";
            pst=conn.prepareStatement(sql);
            pst.setString(1,rfid);
            rs=pst.executeQuery();
            ID=rs.getString("ID");
            return ID;
        }catch(Exception e){
            JOptionPane.showMessageDialog(null, e, sql+" --> leads to exception", 1);
            return null;
        }finally{
            try{
                conn.close();
                pst.close();
                rs.close();
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e, "finally exception", 1);
            }
        }
    }

Da die Karten öfters gelesen werden kommt es zu wiederholenden Abfragen, doch obwohl ich die Verbindung immer neu aufbaue bekomme ich eine Exception: ResultSet ist closed;

Wie vermeide ich diesen Fehler?

Freundliche Grüße Jochim
 

Neumi5694

Top Contributor
Du schließt das Resultset nach der Connection, die Wahrscheinlichkeit ist hoch, dass das Resultset dann schon zu ist.
Dreh die Reihenfolge der close()-Befehle um, fang immer mit dem Kleinsten an.

Oder aber, du machst gleich Nägel mit Köpfen und verwendest try-with-resources, da sparst du dir das Schließen der Objekte.
Java:
    public String getID(String rfid){
        System.out.println("Methode: searchRFID");
        String sql="SELECT ID,RFID FROM products WHERE RFID=?";
        String ID;
        try (Connection conn=JavaConnection.ConnecrDB()) {
            try(PreparedStatement pst = conn.prepareStatement(sql)) {
                pst.setString(1,rfid);
                try (ResultSet rs=pst.executeQuery()) {
                    ID = rs.getString(1);
                }
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e, sql+" --> leads to exception", 1);
            ID = null;
        }
        return ID;
    }
 
Zuletzt bearbeitet:

klauskarambulut

Bekanntes Mitglied
Lerne lieber mal schnellstens den Unterschied zwischen Lokalen Variablen und Instanz Variablen und statischen Variablen kennen. Das Zeug was den wenigsten Ärger macht sind lokale Variablen.

Danach auch mal einen Blick zu Try-with-Resource werfen, wie Neumi das schon so schön vorschlägt, dann spart man sich das ganze geclose.

Code:
try(Connection conn=JavaConnection.ConnecrDB()){
           try(PreparedStatement pst = conn.prepareStatement(sql)){

Kann man hier allerdings auch in einen Block verfrachten.

Code:
try(Connection conn=JavaConnection.ConnecrDB();
           PreparedStatement pst = conn.prepareStatement(sql)){

Da beides conn und pst Autoclosable ist.

Darüber hinaus sollte man den Mist lassen Swing in Form von JOptionPane und JDBC in einer Methode zu verwenden.
Das ganze auftrennen und ordentlich strukturieren. Swing und JDBC sollten nicht mal im selben Package importiert werden.

Und ausserdem muss nach einem executeQuery() zwingend ein next() folgen, der den Cursor des Ergebnisses auf die erste Ergebniszeile setzt aufgerufen werden.

Code:
try(ResultSet rs=pst.executeQuery()){
  if(rs.next()) {
    String ID = rs.getString(1); //Lokale Variable mit möglichst kleinem Scope
    return ID;
  } else {
    return null; //weil nix gefunden, oder fachliche Exception schmeißen.
  }
}
...Fehlerbehandlung, null zurückgeben oder fachliche Exception schmeißen.
 

Neumi5694

Top Contributor
In meinem Beispiel fehlt natürlich
Java:
if (rs.next())
, was vor dem Auslesen stehen muss. (Im Falle mehrer Ergebnisse ist
Java:
while (rs.next)
zu verwenden)
Das kommt davon, wenn man davon ausgeht, dass es im ersten Beispiel richtig war :)
 

Jochim

Mitglied
Guten Abend,
danke für die Antworten. Ich habe nun die Try-with-Resources eingebaut und es funktioniert.
Ich habe einfach das Problem, dass in der Schule noch nach alten Methoden gelehrt wird.

Noch einmal meine fertige Methode:
Java:
public String getID(String rfid){
        System.out.println("Methode: searchRFID: "+rfid);
        String sql="SELECT ID,RFID FROM products WHERE RFID=?";
        try(Connection conn=JavaConnection.ConnecrDB();
           PreparedStatement pst = conn.prepareStatement(sql)){
                pst.setString(1,rfid);
                rs=pst.executeQuery();
                if(rs.next()) {
                    String ID = rs.getString(1); //Lokale Variable mit möglichst kleinem Scope
                    System.out.println("id: "+ID);
                    return ID;
                } else {
                    System.out.println("id: null");
                    return ""; //weil nix gefunden, oder fachliche Exception schmeißen.
                }
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

Freundliche Grüße

Damien Jochim.
 

Neumi5694

Top Contributor
Die Methode aus der Schule funktioniert genau so gut, ist zum Lernen vielleicht noch besser.
Die try-with-Methode erspart dir nur etwas Tipparbeit, der compilierte Code funktioniert genau so, als ob du nacheinander die Objekte manuell schließen würdest. Bei dir war letztendlich nur die Reihenfolge falsch (arbeite nach dem LIFO-Prinzip, Zugriffe in der verkehrten Reihenfolge schließen, wie du sie geöffnet hast.), try-with ist dann halt noch etwas eleganter.

ps: Deine catch-Klausel kannst du noch etwas sinnvoller gestalten.
1. Nutze als Ausgabe System.err und nicht den Default (System.out)
2. Gib vor dem Stacktrace auch getMessage() der Exception aus

Besser noch: Verwende einen Logger anstatt der manuellen Ausgabe nach System.err
 

Joose

Top Contributor
Wie oben schon gesagt erspart try-with Schreibarbeit.
Ich finde es gut ihr die normale try/catch/finally Variante gelehrt bekommt. Dabei lernt man eben auch das Ressourcen geschlossen werden sollten und es kommt war das man nicht mit try-with arbeiten kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
S ResultSet closed Datenbankprogrammierung 2
P ResultSet closed Datenbankprogrammierung 7
A Operation not allowed after ResultSet closed Datenbankprogrammierung 13
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben