Hibernate自定义类型以避免’引起:java.sql.SQLException:Stream已经关闭’

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

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

谢谢

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

文件 :

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

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

至于hibernate – 请看这个问题 。

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

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

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

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

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

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

当您尝试多次从结果集中获取Oracle LONG值时,我认为您收到此消息。

我的代码如下:

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

我开始得到“Stream已经关闭”。 错误。 当我将代码更改为时,我停止了错误:

  String str = rs.getString(i+1) ; if (rs.wasNull()) continue ; set(queryAttr[i], str) ;