ORA-01461 / BLOB / 休眠

Posted

技术标签:

【中文标题】ORA-01461 / BLOB / 休眠【英文标题】:ORA-01461 / BLOB / Hibernate 【发布时间】:2013-03-14 17:17:00 【问题描述】:

我有一个 Oracle Database 10.2.0.4 实例。 我有基于 spring 框架 3.0.5、hibernate 3.5.6 的 java 应用程序。 我有一个带有 BLOB 列 (blobContent BLOB) 的表和一个带有 java.sql.Blob 字段的实体(在休眠 XML 映射中映射为 <property name="blobContent" type="blob"/>)。 我使用 Oracle10gDialect。

我得到 ORA-01461 定期尝试在此表中插入行。 我尝试了几个 Oracle JDBC 驱动程序(10.2.0.4、10.2.0.5 和 11.2.0.3),但都没有成功。 我在谷歌上搜索和搜索这个问题的金属链接数据库失败了。 我反编译了 Oracle JDBC 驱动程序并检查了从方法 oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(int, InputStream, long)oracle.jdbc.driver.DBConversion 直到 oracle.jdbc.driver.OracleConversionInputStream 的代码。

就这段代码而言,一切看起来都还可以:)

请告知如何跟踪此问题...可能在 Oracle 方面(?)...可能正在寻找一些隐式转换... 我可能错过了一些关于这个问题的已知 Oracle metalink 文章吗?

【问题讨论】:

您是否尝试通过 INSERT 语句插入 LOB? 是否有理由不使用字节数组来映射 blob 内容? @Rachcha 是的,我正在尝试插入 BLOB。但是一些偶尔的插入语句会因 ORA-01461 而失败。看起来 Oracle 或 Oracle JDBC 驱动程序有时决定将参数值处理为 Oracle LONG 类型。我无法理解它为什么以及在什么情况下会进行这种转换。由于某些情况,我很难在测试环境中重现此问题。这就是我在这里向专家提问的原因。 @SamiKorhonen,是的,当然,有一个重要原因:blob 内容的大小可以很小,也可以很大,甚至可以很大。新的 jdbc API 添加方法 setBinaryStream(int, InputStream, long) 以支持超过 2Gb 的内容大小。解析这个方法代码,我发现处理流有三个分支:大小超过 1g,超过一些物理连接参数和其他使用字节数组时小 blob 的情况。内存消耗非常关键和重要。 也许这个答案可以帮助你:***.com/questions/9156019/… 【参考方案1】:

我认为跟随 oracle 错误是我的错误的主要原因。升级数据库后,我将再次检查问题并接受我自己的答案。我希望它对其他人有用。

顺便说一下,我们的平台也是 AIX/64x。

Oracle 错误 9018715“没有长列类型的更新和插入中出现间歇性 ORA-1461”

B 型 - 缺陷

在产品版本 11.1.0.7.0 中已修复

2 级严重性 - 服务严重中断

产品版本 10.2.0.4.0

状态 93 - 已关闭,未由 Filer 验证

平台 212 - POWER 系统上的 IBM AIX(64 位)

创建于 2009 年 10 月 14 日

平台版本 5.3

201 年 12 月 27 日更新

基本错误不适用

数据库版本 10.2.0.4.0

影响平台通用

产品来源甲骨文

问题:

ORA-1461: 只能绑定 LONG 值以插入 LONG 列 在客户端应用程序中经常收到。

该错误出现在插入和更新语句中,以及不同的表中。 语句属于这种类型: 插入列 (, , ,..) 值(:1,:2,:3,...:n); 或者 更新集 = :1, = :2, = :3,.. = :n 其中 =:m; 并且没有一列是 lONG 类型的。

诊断分析:

将 rdbms 从 10.2.0.3 升级到后开始出现错误 10.2.0.4。 它经常发生,并且在不同的表上。一旦错误出现 发生,重新执行相同的sql通常会成功。

数据库字符集:WE8ISO8859P15。 Windows 客户端。 NLS 设置:NLS_LANG=American_America.WE8ISO8859P15。

应用程序通过 Jdbc 瘦驱动程序版本 10.2.0.1 连接。 使用 jdbc 驱动程序版本 10.1.0.5 进行的测试也失败了。

【讨论】:

我有相同的 Oracle 版本和相同的问题。感谢您发布此答案。

以上是关于ORA-01461 / BLOB / 休眠的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01461 带有 MERGE INTO 语句和 clob 列

oracle: sql语句报ora-01461/ora-00911错误

这两个不同的 ORA 错误(ORA-12899 和 ORA-01461)如何链接在一起

平台中配置网格列表样式报:ORA-01461错误

ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法

异常 ORA-00942: 表或视图不存在 - 使用休眠会话插入现有表时