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

时间:2012-04-16 13:20:31

标签: java oracle hibernate custom-type

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

  

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

由于

4 个答案:

答案 0 :(得分:8)

Oracle recommends not using LongLong 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) ;