Derby/JavaDB result set closed

chrisööö

Mitglied
Hallo,
ich bekomme immer folgende Fehlermeldung:

Dez 01, 2013 4:37:27 PM Remote.RemoteAsync$10 run
SEVERE: null
Exceptions.SasInternalException: Invalid operation: result set closed
at Controller.User.User.loadDepots(User.java:136)
at Controller.Remote.RemoteServiceImpl.getDepot(RemoteServiceImpl.java:187)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
at com.sun.proxy.$Proxy7.getDepot(Unknown Source)
at Remote.RemoteAsync$10.run(RemoteAsync.java:420)
at java.lang.Thread.run(Thread.java:722)

Java:
public boolean loadDepots() throws SasInternalException {
        try {
            depotdao = new DepotDAO();
            depots = depotdao.getUserDepots(this);
        } catch (SasInternalException ex) {
            throw new SasInternalException(ex.getMessage());
        }
        return true;
    }

Dies ist die Methode die auf die DepotDAO Klasse zugreift

Java:
public List<Depot> getUserDepots(User user) throws SasInternalException {
        //ArrayList die die Depots enthält
        ArrayList<Depot> depotList = new ArrayList<Depot>();
        //Ergebnis für die SQL Abfrage
        ResultSet result = null;
        //Verbindung zur Datenbank holen
        Connection connection = dbm.getConnection();
        //Statement das die SQL Abfrage beinhaltet
        PreparedStatement statement = null;


        try {
            //SQL String mit wildcards wird vorbereitet
            statement = connection.prepareStatement(
                    "select * from \"Depot\" where EMAIL = ?");

            //Wildcards werden ersetzt
            statement.setString(1, user.getEmail());

            //Statement wird ausgeführt
            result = statement.executeQuery();

            //Alle gefundenen Datensätze werden eingelesen
            while (result.next()) {

                    Depot depot = read(result);
                    depot.setLoadedFromDB(true);
                    //Der Depotliste wird das Depot hinzugefügt
                    depotList.add(depot);
                
            }

            //Fehlerbehandlung
        } catch (SQLException ex) {
            Logger.getLogger(DepotDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new SasInternalException(ex.getMessage());
        } finally {
            //Verbindung zur Datenbank wird geschlossen
            dbm.disconnect();
        }

        return depotList;
    }

Die Methode getUserDepots liefert mir die Depots zu einem User. Hier tritt der Fehler scheinbar auf. Leider weiss ich nicht warum. Er tritt auch nicht immer auf. Nur ab und an. Das jeweilige Depot wird trotz Fehlermeldung geladen. Ich sehe einfach keinen Fehler. Scheinbar ist das Resultset geschlossen und es wird noch zugegriffen. Kann mir Jemand helfen?
 
Scheinbar ist das Resultset geschlossen und es wird noch zugegriffen

Leider genau hierzu sehe ich keinerlei Code. Vermutung ist, das du Connection,Statements, Resultset nicht korrekt schließt.

Ich persönlich halte auch das Auffangen von SQLExceptions und diese als SasInternalException ohne Stacktrace weiter zu werfen für falsch. Daher wissen wir nicht, ob da unten nicht was ganz anderes passiert ist.
 
Hallo,
ein prinStackTrace() liefert folgende Ausgabe:

java.sql.SQLException: Das ResultSet ist nicht geöffnet. Die Operation 'next' ist unzulässig. Prüfen Sie, ob das automatische Festschreiben inaktiviert ist.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
at org.apache.derby.client.am.ResultSet.next(Unknown Source)
at Model.DepotDAO.getUserDepots(DepotDAO.java:252)
at Controller.User.User.loadDepots(User.java:134)

Ich vermute das damit ein setAutoCommit() gemeint ist?

Selbst wenn ich ein !result.isClosed() in die Abfrage noch hinzufüge kommt der Fehler noch.

Java:
//Alle gefundenen Datensätze werden eingelesen
            while (result.next() && !result.isClosed()) {

                Depot depot = read(result);
                depot.setLoadedFromDB(true);
                //Der Depotliste wird das Depot hinzugefügt
                depotList.add(depot);

            }
 
Zuletzt bearbeitet:
Wenn es das setAutoCommit() wirklich ist, ich gehe auch mal davon aus, interessiert mich die Art der Verbindung zur DB.

Kannst du daher bitte mal den jdbc Verbindungsaufbau posten?

Desweiteren scheinst du mit RMI zu arbeiten und schlage vor, alle diese Dinge mal zu entfernen und nur ein kleines Testprogramm zu schreiben, das ausschließlich in die DB einloggt, loadDepots aufruft und über das Resultset iteriert und auf der Konsole ausgibt.

So können wir ausschließen, das andere Themen/Probleme involviert sind.
 

Neue Themen


Zurück
Oben