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

use*_*131 11 java oracle hibernate custom-type

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

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

谢谢

Ano*_*ous 10

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列的限制要少得多.

至于休眠 - 请看这个问题.


Pab*_*blo 5

以下内容未回答原始问题"如何编写自定义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