Пользовательский тип гибернации, чтобы избежать «Причины: java.sql.SQLException: поток уже закрыт»

Как мне написать собственный класс Long для обработки длинных значений в Oracle, чтобы избежать следующей ошибки?

Caused by: java.sql.SQLException: Stream has already been closed.

Спасибо

Ответы на вопрос(4)

Это происходит в запросе системных таблиц:

SELECT * FROM all_tab_columns
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%';
 16 июл. 2013 г., 12:39
Как это отвечает на вопрос?

оракулрекомендует не использовать Long а такжеLong Raw столбцы (начиная с Oracle 8i). Они включены в Oracle только по наследству. Если вам действительно нужно их использовать, вы должны сначала обработать эти столбцы, прежде чем пытаться касаться любых других столбцов вResultSet:

Документы:

When a query selects one or more LONG or LONG RAW columns, the JDBC driver transfers these columns to the client in streaming mode. After a call to executeQuery or next, the data of the LONG column is waiting to be read.

Do not create tables with LONG columns. Use large object (LOB) columns, CLOB, NCLOB, and BLOB, instead. LONG columns are supported only for backward compatibility. Oracle recommends that you convert existing LONG columns to LOB columns. LOB columns are subject to far fewer restrictions than LONG columns.

Что касается гибернации - посмотрите этовопрос.

 user131613117 апр. 2012 г., 14:10
Я пытался реализовать hibernate UserType на долгое время, но все еще с той же ошибкой. Причина: java.sql.SQLException: поток уже был закрыт. Может кто-нибудь предложить мне это, чтобы избежать этой ошибки?
 19 апр. 2012 г., 20:31
И еще одна вещь, Hibernate получает столбцы изResultSet как они нужны. Было бы хорошо, чтобы получитьLONG RAW колонка первая? (Oracle предполагает, что доступ к столбцам осуществляется в порядке слева направо, а потоки закрываются при доступе к столбцам после столбцов потока)
 17 апр. 2012 г., 14:21
Просто перед тем, как попробовать что-то более сложное ... Вы пробовали новый драйвер JDBC?

Нижеследующее не отвечает на первоначальный вопрос, как написать собственный класс Long для обработки длинных значений в Oracle. но может быть полезным, чтобы избежать «потока уже закрыт»; ошибка при запросе длинных необработанных столбцов Oracle.

Мы столкнулись с этой ошибкой, используя устаревшую базу данных без шансов изменить тип столбца. Мы используем Spring с фабрикой сессий hibernate3 и менеджером транзакций. Проблема возникла, когда более чем одна задача одновременно обращалась к DAO. Мы используем драйвер ojdbc14.jar и попробовали новый, но не повезло.

Установка useFetchSizeWithLongColumn = true в свойствах соединения для драйвера OJDBC решила проблему. УвидетьOracleDriver API

THIS IS A THIN ONLY PROPERTY. IT SHOULD NOT BE USED WITH ANY OTHER DRIVERS. If set to "true", the performance when retrieving data in a 'SELECT' will be improved but the default behavior for handling LONG columns will be changed to fetch multiple rows (prefetch size). It means that enough memory will be allocated to read this data. So if you want to use this property, make sure that the LONG columns you are retrieving are not too big or you may run out of memory. This property can also be set as a java property : java -Doracle.jdbc.useFetchSizeWithLongColumn=true myApplication

Я думаю, что вы получаете это сообщение, когда пытаетесь получить значение Oracle LONG из набора результатов несколько раз.

У меня был код как:

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

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

И я начал получать «Поток уже закрыт». ошибка. Я перестал получать ошибку, когда я изменил код на:

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

        set(queryAttr[i], str) ;

Ваш ответ на вопрос