Ergebnis 1 bis 3 von 3

Thema: org.postgresql.util.PSQLException - A result was returned when none was expected

  1. #1
    chris123 ist offline Neuer Benutzer
    Registriert seit
    19.12.2011
    Beiträge
    2

    Standard org.postgresql.util.PSQLException - A result was returned when none was expected



    Hallo zusammen,
    ich stehe aktuell vor einem großen Problem.

    Meine Java Applikation verwendet eine PostgreSQL Datenbank.
    Ich habe eine PostgreSQLDriver Klassen, welche zu Beginn EINE Connection zur Datenbank initialisiert und am Ende wieder beendet.

    Meine PostgreSQLDriver bietet verschiedene Schnittstellen an, um Funktionen auf der Datenbank auszuführen (hinzufügen/entfernen/Query).
    Dieser können dann von anderen Objekten aus ausgeführt werden.

    Jede Funktion auf der Datenbank, die ja in der PostgreSQLDriver-Klasse implementiert ist, erzeugt einen neuen Thread, der sich eben um die Aktion kümmert und danach wieder entfernt wird. Dieser Thread bekommt eine Referenz auf das Connection-Objekt.
    Die Funktionen "hinzufügen" und "entfernen" laufen in einem Synchronized-Block ab. Die Funktion "Query" läuft nicht synchronized ab.

    So.
    Bisher hat immer alles problemlos funktioniert.
    Jetzt gibt es aber manchmal ein Problem - natürlich nicht reproduziertbar - bei dem zwei Exceptions fast zeitgleich geworfen werden.
    Zur Info: Bei mir laufen parallel viele Query's und Updates gleichzeitig ab.
    ich erhalte folgende Fehler:
    org.postgresql.util.PSQLException: A result was returned when none was expected.
    org.postgresql.util.PSQLException: No results were returned by the query.

    Dass diese Fehler fast zeitgleich auftreten, könnte vielleicht etwas mit der Ursache von meinem Problem zu tun haben.

    Nun bin ich auf der Suche nach der Ursache von meinem Problem. Meine Überlegung war:
    Es werden gleichzeit Query und Update von meinem Programm ausgeführt. Der Thread mit dem Update-Aufruf erhält von der Datenbank das Ergebnis des Query-Threads und umgekeht.
    Eine vielleicht etwas Wirre Vorstellung, aber ich weiss aktuell einfach nicht was die Ursache von meinem Problem ist.


  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Zitat Zitat von chris123 Beitrag anzeigen
    Die Funktionen "hinzufügen" und "entfernen" laufen in einem Synchronized-Block ab. Die Funktion "Query" läuft nicht synchronized ab.

    [....]
    Es werden gleichzeit Query und Update von meinem Programm ausgeführt. Der Thread mit dem Update-Aufruf erhält von der Datenbank das Ergebnis des Query-Threads und umgekeht.
    Das kann nicht funktionieren (und wenn es bis jetzt funktioniert hat, war das purer Zufall)

    Auf einem Connection Objekt kann immer nur exakt ein(!) java.sql.Statement Objekt zur gleichen Zeit aktiv sein. Du musst auch deine Query Aufrufe synchronisieren.

    Viel sinnvoller wäre es allerdings wenn Du einen Connection Pool verwendest.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  3. #3
    chris123 ist offline Neuer Benutzer
    Registriert seit
    19.12.2011
    Beiträge
    2

    Standard

    Hey, vielen Dank für die Antwort.
    Also ich werde das jetzt nochmal prüfen. Bin aber etwas verwirrt.

    Ich habe einen Test laufen lassen, wo ein Threadpool gleichzeitig Query's ausführt, sowie Elemente hinzufügt und entfernt.
    Ich bin davon ausgegangen dass Connection threadsafe ist, zumindest ist das in der PostgreSQL Doku so beschrieben.

    Mein Test mit dem Threadpool ergab auch keinen Fehler.

    Jetzt wo du mir aber sagst dass ich immer nur ein Statement Objekt von einer Connection aktiv sein kann, muss ich das mal prüfen. War mir bisher zumindest nicht bewusst.

    Die Variante mit einem Connection Pool habe ich bereits implementiert. Es gab hier ein ganz treffendes Beispiel: Chapter 8 Continued: Connection Pooling
    Da ich aber den Fehler nicht reproduzieren kann, wende ich es noch nicht an.
    War aber auch hier der Meinung dass dies keine Lösung ist, da ein Connection Pool nur dann sinnvoll ist, wenn es performance Probleme gibt, da eben gleichzeitig mehrere Connections zur Datenbank bestehen. Das Problem dass ich habe, lässt sich dadurch nicht lösen (dachte ich zumindest).

Ähnliche Themen

  1. Problem Kein Result bei RETURN QUERY?
    Von FireFlyer im Forum PL/pgSQL
    Antworten: 13
    Letzter Beitrag: 13.02.2012, 22:08
  2. JDBC: PSQLException Encoding
    Von Magnus im Forum Programmierung
    Antworten: 16
    Letzter Beitrag: 29.11.2011, 11:02
  3. Problem Fehlermeldung: query returned more than one row
    Von Munis im Forum Trigger und Funktionen
    Antworten: 1
    Letzter Beitrag: 19.05.2011, 21:39
  4. C-Interface: Größe des Result aus COPY Cmd
    Von beho im Forum externe Schnittstellen
    Antworten: 0
    Letzter Beitrag: 14.11.2007, 18:00
  5. DataReader positioned beyond end of result set?!
    Von Nils im Forum Programmierung
    Antworten: 0
    Letzter Beitrag: 15.05.2007, 10:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum