2012-04-16 17 views

Respuesta

8

Oracle recommends not usingLong y Long Raw columnas (desde Oracle 8i). Se incluyen en Oracle solo por razones heredadas. Si realmente necesitan para su uso, el que debe manejar por primera vez estas columnas antes de intentar tocar otras columnas en el ResultSet:

Docs:

Cuando una consulta selecciona una o más columnas LONG RAW o LONG , el controlador JDBC transfiere estas columnas al cliente en modo de transmisión. Después de una llamada a executeQuery o siguiente, los datos de la columna LONG esperan ser leídos.

No cree tablas con columnas LONG. En su lugar, utilice columnas de objetos grandes (LOB), CLOB, NCLOB y BLOB. Las columnas LARGAS solo se admiten por compatibilidad con versiones anteriores. Oracle recomienda que convierta columnas LONG existentes a columnas LOB. Las columnas LOB están sujetas a muchas menos restricciones que las columnas LONG.

En cuanto a la hibernación - vea esto question.

+0

Probé mediante la implementación de UserType hibernación durante mucho tiempo pero aún así mismo error causado por: java.sql.SQLException: Secuencia que ya ha sido closed.Can alguien me sugieren en esto para evitar este error? – user1316131

+0

Justo antes de intentar algo más sofisticado ... ¿Has probado el nuevo controlador JDBC? – Anonymous

+0

Y una cosa más, Hibernate obtiene las columnas del 'ResultSet' tal como se necesitan. ¿Estaría bien obtener primero la columna 'LONG RAW'? (Oracle supone que se accede a las columnas en el orden de izquierda a derecha y las secuencias se cierran cuando se accede a las columnas después de columnas de secuencia) – Anonymous

4

Lo siguiente no responde a la pregunta original 'cómo escribir una clase larga personalizada para manejar valores largos en Oracle', pero puede ser útil para evitar el error 'Stream ya se ha cerrado' al consultar columnas sin formato de Oracle.

Nos enfrentamos a este error utilizando una base de datos heredada sin posibilidades de cambiar el tipo de columna. Usamos Spring con la fábrica de sesiones hibernate3 y el administrador de transacciones. El problema ocurrió cuando más de una tarea accedía al DAO al mismo tiempo. Estamos usando el controlador ojdbc14.jar e intentado uno nuevo sin suerte.

Al establecer useFetchSizeWithLongColumn = true en las propiedades de conexión para el controlador OJDBC se solucionó el problema. Ver el OracleDriver API

ESTA ES UNA PROPIEDAD DELGADA SOLAMENTE. NO DEBE UTILIZARSE CON CUALQUIER OTRO DRIVERS. Si se establece en "true", se mejorará el rendimiento al recuperar datos en 'SELECT', pero el comportamiento predeterminado para manejar columnas LONG se cambiará para recuperar varias filas (tamaño de captación previa). Es significa que se asignará suficiente memoria para leer estos datos. Por lo tanto, si desea usar esta propiedad en , asegúrese de que las columnas LONG que está recuperando no sean demasiado grandes o que se quede sin memoria. Esta propiedad también se puede establecer como una propiedad java: java -Doracle.jdbc.useFetchSizeWithLongColumn = true mi_aplicación

-1

Esto sucede en una consulta de tablas del sistema:

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

¿Cómo responde la pregunta? – gaborsch

-1

creo que se obtiene este mensaje cuando intenta obtener un valor LONG de Oracle desde el conjunto de resultados en múltiples ocasiones.

que tenían un código como:

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

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

Y empecé a recibir la "secuencia ya se ha cerrado." error. Deje de tener el error cuando he cambiado el código para:

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

     set(queryAttr[i], str) ; 
Cuestiones relacionadas