Hibernate的自定义类型,以避免“产生的原因:java.sql.SQLException中:流

2019-07-29 00:42发布

我怎样写一个自定义的龙类来处理长值在Oracle中,避免以下的错误?

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

谢谢

Answer 1:

甲骨文建议不要使用 LongLong Raw列(由于Oracle 8I)。 他们对遗留的原因包括在甲骨文。 如果你真的需要使用它们时,你应该首先尝试触摸在任何其他列前处理这些列ResultSet

文档 :

当查询选择一个或多个LONG或LONG RAW列,JDBC驱动这些列传送到以流模式的客户端。 到的executeQuery或下一个电话后,长列的数据正等待被读取。

不要创建LONG列的表。 使用大对象(LOB)列,CLOB,NCLOB,和BLOB,来代替。 LONG列仅支持向后兼容。 Oracle建议您将现有LONG列到LOB列。 LOB列都受到比长列的限制要少得多。

至于休眠-看到这个问题 。



Answer 2:

下列不回答原来的问题“如何编写自定义的龙类来处理在甲骨文长期价值”,但可能会有所帮助查询的Oracle LONG RAW列时避免“流已经关闭”的错误。

我们使用的是传统的数据库没有更改列类型的机会遇到这个错误。 我们使用Spring与Hibernate3的会话工厂和事务管理。 当多个任务同时进行访问DAO发生的问题。 我们正在使用ojdbc14.jar的驱动程序,并试图更新一个没有运气。

设置useFetchSizeWithLongColumn =在为OJDBC驱动程序的连接属性真正的解决了这个问题。 见一个OracleDriver API

它是一个很小的唯一属性。 它不应该与任何其他驱动程序使用。 如果检索数据时设置为“真”,表现“选择”会有所改善,但处理LONG列的默认行为将被更改为获取多行(预取大小)。 这意味着足够的内存将被分配到读取该数据。 所以,如果你想使用这个属性,请确保您检索的LONG列不是太大,或者您可能会遇到内存不足。 这个属性也可以设置为Java属性:JAVA -Doracle.jdbc.useFetchSizeWithLongColumn =真为MyApplication



Answer 3:

这发生在系统表的查询:

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


Answer 4:

我认为当你尝试从结果集多次,一个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) ;


文章来源: Hibernate custom type to avoid 'Caused by: java.sql.SQLException: Stream has already been closed'