2012-04-16 9 views

Antwort

8

Oracle recommends not usingLong und Long Raw Spalten (seit Oracle 8i). Sie sind in Oracle nur aus Legacy-Gründen enthalten. Wenn Sie wirklich brauchen zu verwenden, verarbeiten die Sie sollten zuerst diese Spalten, bevor Sie andere Spalten in der ResultSet zu berühren versuchen:

Docs:

Wenn eine Abfrage wählt einen oder mehrere LONG oder LONG RAW-Spalten Der JDBC-Treiber überträgt diese Spalten im Streaming-Modus an den Client. Nach einem Aufruf von executeQuery oder next warten die Daten der LONG-Spalte auf das Lesen.

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 question.

+0

habe ich versucht, durch Hibernate Usertype für lange Umsetzung aber noch denselben Fehler, verursacht durch: java.sql.SQLException: Strom wird bereits closed.Can jemand empfehlen, mich in um diesen Fehler zu vermeiden? – user1316131

+0

Kurz bevor Sie etwas anspruchsvolleres ausprobieren ... Haben Sie den neueren JDBC-Treiber ausprobiert? – Anonymous

+0

Und noch eine Sache, Hibernate holt die Spalten aus dem 'ResultSet', wie sie benötigt werden. Wäre es in Ordnung, zuerst die 'LONG RAW'-Spalte zu bekommen? (Oracle geht davon aus, dass auf die Spalten in der Reihenfolge von links nach rechts zugegriffen wird und die Datenströme werden geschlossen, wenn auf die Spalten nach den Stream-Spalten zugegriffen wird) – Anonymous

4

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

Wir haben diesen Fehler mit einer Legacy-Datenbank festgestellt, ohne dass der Spaltentyp 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.

Die Einstellung useFetchSizeWithLongColumn = true in den Verbindungseigenschaften für den OJDBC-Treiber löste das Problem. Siehe die OracleDriver API

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

-1

Dies geschieht in einer Abfrage von Systemtabellen:

SELECT * FROM all_tab_columns 
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%'; 
+0

Wie beantwortet es die Frage? – gaborsch

-1

Ich denke, diese Nachricht erhalten, wenn Sie versuchen, eine Oracle-LONG-Wert aus der Ergebnismenge mehrere Male zu bekommen.

hatte ich Code wie:

 rs.getString(i+1) ; 
     if (rs.wasNull()) continue ; 

     set(queryAttr[i], rs.getString(i+1)) ; 

Und ich begann die immer "Stream hat bereits geschlossen." Error. Ich hielt den Fehler bekommen, wenn ich den Code geändert:

 String str = rs.getString(i+1) ; 
     if (rs.wasNull()) continue ; 

     set(queryAttr[i], str) ;