Ruhezustand benutzerdefinierten Typ zu vermeiden "verursacht durch: java.sql.SQLException: Stream wurde bereits geschlossen"

8

Wie schreibe ich eine benutzerdefinierte Long-Klasse für lange Werte in Oracle, um den folgenden Fehler zu vermeiden?

  

Erstellt von: java.sql.SQLException: Der Stream wurde bereits geschlossen.

Danke

    
user1316131 16.04.2012, 13:20
quelle

4 Antworten

8

Oracle empfiehlt, nicht zu verwenden Long und Long Raw Spalten (seit Oracle 8i). Sie sind in Oracle nur aus Legacy-Gründen enthalten. Wenn Sie sie wirklich verwenden müssen, sollten Sie zuerst diese Spalten behandeln, bevor Sie versuchen, andere Spalten in ResultSet zu berühren:

Google Docs :

  

Wenn eine Abfrage eine oder mehrere LONG- oder LONG RAW-Spalten auswählt, überträgt der JDBC-Treiber diese Spalten im Streaming-Modus an den Client. Nach einem Aufruf von executeQuery oder next warten die Daten der LONG-Spalte darauf, gelesen zu werden.

     

Erstellen Sie keine Tabellen mit LONG-Spalten. Verwenden Sie stattdessen LOB-Spalten (Large Object), CLOB, NCLOB und BLOB. LONG-Spalten werden nur aus Gründen der Abwärtskompatibilität unterstützt. Oracle empfiehlt, dass Sie vorhandene LONG-Spalten in LOB-Spalten konvertieren. LOB-Spalten unterliegen wesentlich weniger Einschränkungen als LONG-Spalten.

Wie für den Winterschlaf - siehe Frage .

    
Anonymous 16.04.2012 13:24
quelle
4

Die folgende Frage beantwortet nicht die ursprüngliche Frage "Wie schreibe ich eine benutzerdefinierte Long-Klasse, um lange Werte in Oracle zu behandeln", kann aber hilfreich sein, den Fehler 'Stream wurde bereits geschlossen' zu vermeiden, wenn Oracle lange rohe Spalten abgefragt wird / p>

Wir haben diesen Fehler mit einer Legacy-Datenbank gesehen, bei der der Spaltentyp nicht geändert werden konnte. Wir verwenden Spring mit hibernate3 session factory und transaction manager. Das Problem trat auf, wenn mehr als eine Task gleichzeitig auf das DAO zugreift. Wir verwenden ojdbc14.jar Treiber und versuchten einen neueren ohne Glück.

Durch die Einstellung von useFetchSizeWithLongColumn = true in den Verbindungseigenschaften für den OJDBC-Treiber wurde das Problem behoben. Weitere Informationen finden Sie in der OracleDriver-API

  

Dies ist nur eine Eigenschaft. ES SOLLTE NICHT MIT ANDEREN VERWENDET WERDEN   Fahrer. Wenn auf "true" gesetzt, wird die Leistung beim Abrufen von Daten in a   'SELECT' wird verbessert, aber das Standardverhalten für die Behandlung von LONG   Spalten werden geändert, um mehrere Zeilen abzurufen (Prefetch-Größe). Es   bedeutet, dass genügend Speicher zugewiesen wird, um diese Daten zu lesen. Also, wenn   Wenn Sie diese Eigenschaft verwenden möchten, stellen Sie sicher, dass Sie die LONG-Spalten sind   Das Abrufen ist nicht zu groß oder Sie haben nicht genug Speicher. Diese Liegenschaft   kann auch als Java-Eigenschaft festgelegt werden: Java   -Doracle.jdbc.useFetchSizeWithLongColumn = true myApplication

    
Pablo 04.05.2012 13:40
quelle
-1

Dies geschieht in einer Abfrage von Systemtabellen:

%Vor%     
steve thiboutot 15.07.2013 23:14
quelle
-1

Ich denke, Sie erhalten diese Nachricht, wenn Sie versuchen, einen Oracle LONG-Wert mehrmals aus der Ergebnismenge zu erhalten.

Ich hatte Code wie:

%Vor%

Und ich fing an, den "Stream wurde bereits geschlossen." Error. Ich habe den Fehler nicht mehr angezeigt, als ich den Code in:

änderte %Vor%     
John Neville 11.03.2015 16:03
quelle

Tags und Links