休眠自定义类型以避免'Caused by: java.sql.SQLException: Stream has already been closed'



如何编写自定义 Long 类来处理 Oracle 中的长值,以避免以下错误?

原因:java.sql.SQLException:流已被关闭。

谢谢

Oracle

建议不要使用 LongLong Raw 列(从 Oracle 8i 开始)。它们仅出于旧版原因包含在 Oracle 中。如果您确实需要使用它们,则应首先处理这些列,然后再尝试接触ResultSet中的任何其他列:

文档:

当查询选择一个或多个 LONG 或 LONG RAW 列时,JDBC 驱动程序会在流模式下将这些列传输到客户端。在调用 executeQuery 或 next 之后,LONG 列的数据正在等待读取。

不要创建具有 LONG 列的表。请改用大型对象 (LOB) 列、CLOB、NCLOB 和 BLOB。仅支持长列以实现向后兼容性。Oracle 建议将现有的 LONG 列转换为 LOB 列。LOB 列受到的限制比 LONG 列少得多。

至于休眠 - 见这个问题。

以下内容没有回答原始问题"如何编写自定义 Long 类来处理 Oracle 中的长值",但可能有助于避免在查询 Oracle 长原始列时出现"流已关闭"错误。

我们使用旧数据库遇到此错误,没有机会更改列类型。我们将 Spring 与 hibernate3 会话工厂和事务管理器一起使用。当多个任务同时访问 DAO 时,会出现此问题。我们正在使用 ojdbc14.jar 驱动程序,并尝试了一个较新的驱动程序,但没有运气。

在 OJDBC 驱动程序的连接属性中设置 useFetchSizeWithLongColumn = true 解决了该问题。请参阅 OracleDriver API

这是一个薄的仅有的属性。它不应与任何其他一起使用 司机。如果设置为"true",则在 "选择"将得到改进,但处理 LONG 的默认行为 列将更改为提取多行(预提取大小)。它 表示将分配足够的内存来读取此数据。所以如果 你想使用这个属性,确保长列你是 检索不要太大,否则可能会耗尽内存。此属性 也可以设置为java属性: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) ;

这发生在系统表的查询中:

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

相关内容

最新更新