如何编写自定义Long类来处理Oracle中的长值,以避免出现以下错误?
引起:java.sql.SQLException:Stream已经关闭。
由于
答案 0 :(得分:8)
Oracle recommends not using Long
和Long Raw
列(自Oracle 8i以来)。它们仅出于遗留原因包含在Oracle中。如果您确实需要使用它们,则应首先处理这些列,然后再尝试触及ResultSet
中的任何其他列:
Docs:
当查询选择一个或多个LONG或LONG RAW列时,JDBC驱动程序会以流模式将这些列传输到客户端。在调用executeQuery或next之后,LONG列的数据正在等待读取。
不要创建包含LONG列的表。请改用大对象(LOB)列,CLOB,NCLOB和BLOB。仅支持LONG列以实现向后兼容性。 Oracle建议您将现有的LONG列转换为LOB列。与LONG列相比,LOB列的限制要少得多。
至于休眠 - 请参阅此question。
答案 1 :(得分:5)
以下内容并未回答原始问题'如何编写自定义Long类来处理Oracle中的长值'但可能有助于避免“流已经关闭”#39;查询Oracle长原始列时出错。
我们使用遗留数据库遇到此错误,无法更改列类型。我们使用Spring和hibernate3会话工厂和事务管理器。当多个任务同时访问DAO时,会出现问题。 我们正在使用ojdbc14.jar驱动程序并尝试了一个没有运气的新驱动程序。
在OJDBC驱动程序的连接属性中设置useFetchSizeWithLongColumn = true解决了问题。请参阅OracleDriver API
这是一个非常好的财产。它不应该与任何其他人一起使用 驱动程序。如果设置为" true",则检索数据时的性能 '选择'将被改进,但处理LONG的默认行为 列将更改为获取多行(预取大小)。它 表示将分配足够的内存来读取此数据。因此,如果 如果您想使用此属性,请确保您拥有LONG列 检索不是太大,或者你可能会耗尽内存。这个性质 也可以设置为java属性:java -Doracle.jdbc.useFetchSizeWithLongColumn = true myApplication
答案 2 :(得分:-1)
在系统表的查询中会发生这种情况:
SELECT * FROM all_tab_columns
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%';
答案 3 :(得分:-1)
我认为当您尝试多次从结果集中获取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) ;