Frage

Angenommen, ich einen JDBC-Anruf mache und ich hatte abgerufenen Daten aus einer Datenbank in einem ResultSet. Aber aufgrund eines Netzwerkproblems verlor ich meine Verbindung mit der Datenbank.

(Connection, Statement und ResultSet ist nicht in DB geschlossen). Werde ich noch in der Lage sein, über die ResultSet iterieren?

War es hilfreich?

Lösung

Auch wenn Sie könnten, sollten Sie nicht, wenn Sie codieren gegen einen sehr spezifischen JDBC-Treiber. In einigen Fällen wird die Ergebnismenge überhaupt nicht aufgebaut werden. In anderen Ländern (Oracle IIRC), man könnte es so konfiguriert, dass es nur eine geben Anzahl der Zeilen aus der Gesamt abruft.

Aber im Allgemeinen, wenn Sie die Verbindung verlieren, haben Sie mehr Dinge über als fragen, sich Sorgen zu machen, wenn Sie ein teilweise geholt resulst Set Objekt iterieren können. In solchen Fällen ist die Faustregel

    ;
  1. das Schlimmste anzunehmen,
  2. Versuch, die Ergebnismenge zu schließen, Erklärung und Verbindung; selbst wenn die physikalische Verbindung verloren geht, es könnte Ressourcen wie Speicher sein und Datei-Handles auf der rufenden Seite das muss entsorgt werden;
  3. Wenn möglich, versucht, einen neuen zu bekommen Verbindung (entweder eine neue physikalische ein oder aus einem Verbindungspool) und von vorn beginnen.

Auch als Faustregel gilt: Sie sollten nicht über Teilausfälle sorgen, wenn Anweisungen innerhalb einer Transaktion ausgeführt wird. Verwerfen und versuchen Sie es erneut frisch.

In einigen seltenen Fällen die DB können Sie einen herstellerspezifischen Code senden ( SQLException.getErrorCode () ), die Sie, ob die Operation sagen kann, kann erneut versucht werden. Oracle hat einige spezifische Codes (sie nicht erinnern) für die Fälle, wenn Sie einen Einsatz machen und eine einzigartige constrain verletzt wurde. Manchmal werden solche fehlgeschlagenen Operationen erneut versucht werden kann, aber das ist Anbieter und Unternehmen spezifisch sind.

In der Regel nur Dump die Ergebnismenge zerfleischte und von vorn beginnen.

Andere Tipps

Ich bin mir ziemlich sicher, dass es hängt ganz davon ab, wie Sie Ihre JDBC-Treiber verarbeitet es. Es kann alle Ergebnisse gepuffert, bevor die Verbindung unterbrochen wurde. Es kann nur die nächsten 10 gepuffert, bevor die Verbindung unterbrochen wurde. Selbst wenn alle Ergebnisse gepuffert wurden, der Fahrer selbst starten Ausnahmen werfen können, bevor Sie Iterieren über die gepufferte Ergebnisse beenden.

Ich persönlich würde davon ausgehen, dass jedes Verhalten nach einer Netzunterbrechung nicht definiert betrachtet wird.

Typischerweise jede Art von „gesamter Ergebnismenge“ Objekt wird nicht vollständig bis der volle Zeilensatz erfolgreich empfangen wurde konstruiert werden. Wenn Sie zum Beispiel eine Eigenschaft wie NumberRecordsAffected auf das Objekt haben, dann müssen sie alle Zeilen erhalten haben.

Jedoch ein zählbares Objekt wie GetFirstRow / GetNextRow wird in der Regel ein Stück von Zeilen zu einer Zeit bringen, so würden Sie die Verbindung starb nicht wissen, bis der aktuelle Puffer erschöpft war (wenn es keine Zeilen-Puffer) und es versucht zu holen die nächste Zeile aus der db.

In jedem Fall würde ich erwarten, eine Ausnahme ausgelöst werden, aber IANAJDBCD (Ich bin kein jdbc Entwickler).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top