11

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

引起:java.sql.SQLException:流已经关闭。

谢谢

4

4 回答 4

10

Oracle建议不要使用 LongandLong Raw列(从 Oracle 8i 开始)。它们仅出于遗留原因包含在 Oracle 中。如果您真的需要使用它们,您应该先处理这些列,然后再尝试触摸以下任何其他列ResultSet

文档

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

不要创建具有 LONG 列的表。请改用大对象 (LOB) 列 CLOB、NCLOB 和 BLOB。支持 LONG 列仅是为了向后兼容。Oracle 建议您将现有的 LONG 列转换为 LOB 列。LOB 列受到的限制远少于 LONG 列。

至于休眠 - 看到这个问题

于 2012-04-16T13:24:50.793 回答
6

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

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

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

这是一个很薄的属性。它不应该与任何其他驱动程序一起使用。如果设置为“true”,则在“SELECT”中检索数据时的性能将得到改善,但处理 LONG 列的默认行为将更改为获取多行(预取大小)。这意味着将分配足够的内存来读取这些数据。因此,如果您想使用此属性,请确保您正在检索的 LONG 列不是太大,否则您可能会耗尽内存。此属性也可以设置为 java 属性:java -Doracle.jdbc.useFetchSizeWithLongColumn=true myApplication

于 2012-05-04T13:40:21.197 回答
0

我认为当您尝试从结果集中多次获取 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) ;
于 2015-03-11T16:03:52.297 回答
-1

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

SELECT * FROM all_tab_columns
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%';
于 2013-07-15T23:14:17.960 回答