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
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:
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 .
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
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%Tags und Links java oracle hibernate custom-type